/ Hex Artifact Content
Login

Artifact e63244ca06c503e5f3c5b7f3c9aea0db826089ed:


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 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
0990: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
09a0: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
09b0: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
09c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
09d0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
09e0: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
09f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0a00: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
0a10: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
0a20: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
0a30: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
0a40: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
0a50: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
0a60: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
0a70: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
0a80: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
0a90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
0aa0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
0ab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
0ac0: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
0ad0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
0ae0: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
0af0: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20  pWC->a[0]);.    
0b00: 6d 65 6d 73 65 74 28 26 70 57 43 2d 3e 61 5b 70  memset(&pWC->a[p
0b10: 57 43 2d 3e 6e 54 65 72 6d 5d 2c 20 30 2c 20 73  WC->nTerm], 0, s
0b20: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
0b30: 2a 28 70 57 43 2d 3e 6e 53 6c 6f 74 2d 70 57 43  *(pWC->nSlot-pWC
0b40: 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 7d 0a 20  ->nTerm));.  }. 
0b50: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
0b60: 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  [idx = pWC->nTer
0b70: 6d 2b 2b 5d 3b 0a 20 20 69 66 28 20 70 20 26 26  m++];.  if( p &&
0b80: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0b90: 28 70 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29  (p, EP_Unlikely)
0ba0: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74   ){.    pTerm->t
0bb0: 72 75 74 68 50 72 6f 62 20 3d 20 73 71 6c 69 74  ruthProb = sqlit
0bc0: 65 33 4c 6f 67 45 73 74 28 70 2d 3e 69 54 61 62  e3LogEst(p->iTab
0bd0: 6c 65 29 20 2d 20 32 37 30 3b 0a 20 20 7d 65 6c  le) - 270;.  }el
0be0: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 74  se{.    pTerm->t
0bf0: 72 75 74 68 50 72 6f 62 20 3d 20 31 3b 0a 20 20  ruthProb = 1;.  
0c00: 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  }.  pTerm->pExpr
0c10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
0c20: 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b 0a 20 20  ipCollate(p);.  
0c30: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d  pTerm->wtFlags =
0c40: 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72   wtFlags;.  pTer
0c50: 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  m->pWC = pWC;.  
0c60: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
0c70: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64   -1;.  return id
0c80: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  x;.}../*.** Retu
0c90: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
0ca0: 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  iven operator is
0cb0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
0cc0: 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a  ators that is.**
0cd0: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20   allowed for an 
0ce0: 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20  indexable WHERE 
0cf0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68  clause term.  Th
0d00: 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74  e allowed operat
0d10: 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20  ors are.** "=", 
0d20: 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20  "<", ">", "<=", 
0d30: 22 3e 3d 22 2c 20 22 49 4e 22 2c 20 61 6e 64 20  ">=", "IN", and 
0d40: 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f 0a 73 74 61  "IS NULL".*/.sta
0d50: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f  tic int allowedO
0d60: 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73  p(int op){.  ass
0d70: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
0d80: 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20   && TK_GT<TK_GE 
0d90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
0da0: 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LT>TK_EQ && TK_L
0db0: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
0dc0: 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51  ert( TK_LE>TK_EQ
0dd0: 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20   && TK_LE<TK_GE 
0de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
0df0: 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20  GE==TK_EQ+4 );. 
0e00: 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49   return op==TK_I
0e10: 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20  N || (op>=TK_EQ 
0e20: 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c  && op<=TK_GE) ||
0e30: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c   op==TK_ISNULL |
0e40: 7c 20 6f 70 3d 3d 54 4b 5f 49 53 3b 0a 7d 0a 0a  | op==TK_IS;.}..
0e50: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
0e60: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0e70: 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e  tor.  Expression
0e80: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
0e90: 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f   op Y".** are co
0ea0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20  nverted into "Y 
0eb0: 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  op X"..**.** If 
0ec0: 6c 65 66 74 2f 72 69 67 68 74 20 70 72 65 63 65  left/right prece
0ed0: 64 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65  dence rules come
0ee0: 20 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20   into play when 
0ef0: 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a  determining the.
0f00: 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ** collating seq
0f10: 75 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c  uence, then COLL
0f20: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72  ATE operators ar
0f30: 65 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e  e adjusted to en
0f40: 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  sure.** that the
0f50: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0f60: 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  nce does not cha
0f70: 6e 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nge.  For exampl
0f80: 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65  e:.** "Y collate
0f90: 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65   NOCASE op X" be
0fa0: 63 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62  comes "X op Y" b
0fb0: 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61  ecause any colla
0fc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e  tion sequence on
0fd0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e  .** the left han
0fe0: 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70  d side of a comp
0ff0: 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73  arison overrides
1000: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
1010: 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61  equence .** atta
1020: 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68  ched to the righ
1030: 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20  t. For the same 
1040: 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f  reason the EP_Co
1050: 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73  llate flag.** is
1060: 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a   not commuted..*
1070: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1080: 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20  prCommute(Parse 
1090: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
10a0: 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70  Expr){.  u16 exp
10b0: 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e  Right = (pExpr->
10c0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
10d0: 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75  EP_Collate);.  u
10e0: 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45  16 expLeft = (pE
10f0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
1100: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b  s & EP_Collate);
1110: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
1120: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
1130: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
1140: 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70  _IN );.  if( exp
1150: 52 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29  Right==expLeft )
1160: 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
1170: 58 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76  X and Y both hav
1180: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
1190: 6f 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f  or or neither do
11a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52   */.    if( expR
11b0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ight ){.      /*
11c0: 20 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61   Both X and Y ha
11d0: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
11e0: 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  tors.  Make sure
11f0: 20 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20   X is always.   
1200: 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c     ** used by cl
1210: 65 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f  earing the EP_Co
1220: 6c 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20  llate flag from 
1230: 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70  Y. */.      pExp
1240: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
1250: 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b   &= ~EP_Collate;
1260: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1270: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1280: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
1290: 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
12a0: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58      /* Neither X
12b0: 20 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c   nor Y have COLL
12c0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62  ATE operators, b
12d0: 75 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64  ut X has a non-d
12e0: 65 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  efault.      ** 
12f0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1300: 63 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20  ce.  So add the 
1310: 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65  EP_Collate marke
1320: 72 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a  r on X to cause.
1330: 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62        ** it to b
1340: 65 20 73 65 61 72 63 68 65 64 20 66 69 72 73 74  e searched first
1350: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72  . */.      pExpr
1360: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c  ->pLeft->flags |
1370: 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20  = EP_Collate;.  
1380: 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45    }.  }.  SWAP(E
1390: 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67  xpr*,pExpr->pRig
13a0: 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ht,pExpr->pLeft)
13b0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
13c0: 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p>=TK_GT ){.    
13d0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
13e0: 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_GT+2 );.    as
13f0: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
1400: 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  LE+2 );.    asse
1410: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
1420: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
1430: 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20  K_GT<TK_LE );.  
1440: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1450: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45  >op>=TK_GT && pE
1460: 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29  xpr->op<=TK_GE )
1470: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
1480: 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b  = ((pExpr->op-TK
1490: 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20  _GT)^2)+TK_GT;. 
14a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e   }.}../*.** Tran
14b0: 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78  slate from TK_xx
14c0: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f   operator to WO_
14d0: 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73  xx bitmask..*/.s
14e0: 74 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74  tatic u16 operat
14f0: 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a  orMask(int op){.
1500: 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72    u16 c;.  asser
1510: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  t( allowedOp(op)
1520: 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   );.  if( op==TK
1530: 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  _IN ){.    c = W
1540: 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  O_IN;.  }else if
1550: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1560: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53  ){.    c = WO_IS
1570: 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NULL;.  }else if
1580: 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 7b 0a 20  ( op==TK_IS ){. 
1590: 20 20 20 63 20 3d 20 57 4f 5f 49 53 3b 0a 20 20     c = WO_IS;.  
15a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
15b0: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
15c0: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
15d0: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
15e0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
15f0: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
1600: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
1610: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
1620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
1630: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
1640: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
1650: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
1660: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
1670: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
1680: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
1690: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
16a0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
16b0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
16c0: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
16d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
16e0: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
16f0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1700: 6f 70 21 3d 54 4b 5f 49 53 20 7c 7c 20 63 3d 3d  op!=TK_IS || c==
1710: 57 4f 5f 49 53 20 29 3b 0a 20 20 72 65 74 75 72  WO_IS );.  retur
1720: 6e 20 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  n c;.}...#ifndef
1730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
1740: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
1750: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
1760: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
1770: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
1780: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
1790: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
17a0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
17b0: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
17c0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
17d0: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
17e0: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
17f0: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
1800: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
1810: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
1820: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
1830: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
1840: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
1850: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
1860: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
1870: 63 61 72 64 2e 20 20 54 68 65 20 4c 48 53 20 6d  card.  The LHS m
1880: 75 73 74 20 62 65 20 61 20 63 6f 6c 75 6d 6e 0a  ust be a column.
1890: 2a 2a 20 74 68 61 74 20 6d 61 79 20 6f 6e 6c 79  ** that may only
18a0: 20 62 65 20 4e 55 4c 4c 2c 20 61 20 73 74 72 69   be NULL, a stri
18b0: 6e 67 2c 20 6f 72 20 61 20 42 4c 4f 42 2c 20 6e  ng, or a BLOB, n
18c0: 65 76 65 72 20 61 20 6e 75 6d 62 65 72 2e 20 28  ever a number. (
18d0: 54 68 69 73 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  This means.** th
18e0: 61 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  at virtual table
18f0: 73 20 63 61 6e 6e 6f 74 20 70 61 72 74 69 63 69  s cannot partici
1900: 70 61 74 65 20 69 6e 20 74 68 65 20 4c 49 4b 45  pate in the LIKE
1910: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 29 20   optimization.) 
1920: 20 54 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   The.** collatin
1930: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
1940: 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  he column on the
1950: 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 70 70   LHS must be app
1960: 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20  ropriate for.** 
1970: 74 68 65 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  the operator..*/
1980: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
1990: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
19a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
19b0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
19c0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
19d0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
19e0: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
19f0: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
1a00: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
1a10: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
1a20: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
1a30: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
1a40: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
1a50: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
1a60: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
1a70: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
1a80: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
1a90: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
1aa0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
1ab0: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
1ac0: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
1ad0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
1ae0: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
1af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1b00: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
1b10: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
1b20: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
1b30: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
1b40: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
1b50: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
1b60: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
1b70: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
1b80: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
1b90: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1ba0: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
1bb0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
1bc0: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be0: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
1bf0: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
1c00: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c20: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
1c30: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
1c40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
1c50: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
1c60: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
1c70: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
1c80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1c90: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
1ca0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1cb0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1cc0: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
1cd0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
1cf0: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
1d00: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
1d10: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
1d20: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
1d30: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
1d40: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
1d50: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
1d60: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
1d70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
1d80: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
1d90: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1da0: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
1db0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
1dc0: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
1dd0: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
1de0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1df0: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
1e00: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
1e10: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
1e20: 3e 70 54 61 62 29 20 20 2f 2a 20 56 61 6c 75 65  >pTab)  /* Value
1e30: 20 6d 69 67 68 74 20 62 65 20 6e 75 6d 65 72 69   might be numeri
1e40: 63 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  c */.  ){.    /*
1e50: 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39   IMP: R-02065-49
1e60: 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  465 The left-han
1e70: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49  d side of the LI
1e80: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
1e90: 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  tor must.    ** 
1ea0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
1eb0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1ec0: 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e   with TEXT affin
1ed0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
1ee0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 0;.  }.  asse
1ef0: 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  rt( pLeft->iColu
1f00: 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42  mn!=(-1) ); /* B
1f10: 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72  ecause IPK never
1f20: 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f   has AFF_TEXT */
1f30: 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c  ..  pRight = sql
1f40: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1f50: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ate(pList->a[0].
1f60: 70 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70  pExpr);.  op = p
1f70: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
1f80: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
1f90: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52   ){.    Vdbe *pR
1fa0: 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73  eprepare = pPars
1fb0: 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20  e->pReprepare;. 
1fc0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52     int iCol = pR
1fd0: 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  ight->iColumn;. 
1fe0: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
1ff0: 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
2000: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69  ue(pReprepare, i
2010: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Col, SQLITE_AFF_
2020: 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
2030: 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76  Val && sqlite3_v
2040: 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
2050: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
2060: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20        z = (char 
2070: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2080: 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20  text(pVal);.    
2090: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
20a0: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
20b0: 73 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29  se->pVdbe, iCol)
20c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
20d0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
20e0: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
20f0: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
2100: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
2110: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
2120: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
2130: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
2140: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
2150: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
2160: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
2170: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
2180: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
2190: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
21a0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
21b0: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
21c0: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
21d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
21e0: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
21f0: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
2200: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
2210: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
2220: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
2230: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
2240: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
2250: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
2260: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
2270: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
2280: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
2290: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
22a0: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
22b0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
22c0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
22d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
22e0: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
22f0: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ght->iColumn);. 
2300: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
2310: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
2320: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
2330: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
2340: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
2350: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
2360: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
2370: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
2380: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
2390: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
23a0: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
23b0: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
23c0: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
23d0: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
23e0: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
23f0: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
2400: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
2410: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
2420: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
2430: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
2440: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
2450: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
2460: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
2470: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
2480: 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79  hem, add a dummy
2490: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72   OP_Variable her
24a0: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20  e..          */ 
24b0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
24c0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
24d0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
24e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24f0: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
2500: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
2510: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
2520: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2530: 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  3(v, sqlite3Vdbe
2540: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
2550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2560: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2570: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
2580: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2590: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
25a0: 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20        z = 0;.   
25b0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
25c0: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
25d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30  ;.  return (z!=0
25e0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
25f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
2600: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
2610: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2620: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2630: 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  LE./*.** Check t
2640: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
2650: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
2660: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
2670: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
2680: 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a  n MATCH expr.**.
2690: 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e  ** If it is then
26a0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
26b0: 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41  f not, return FA
26c0: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
26d0: 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  nt isMatchOfColu
26e0: 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70  mn(.  Expr *pExp
26f0: 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  r      /* Test t
2700: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
2710: 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
2720: 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  *pList;..  if( p
2730: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e  Expr->op!=TK_FUN
2740: 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74  CTION ){.    ret
2750: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
2760: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2770: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
2780: 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20  "match")!=0 ){. 
2790: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
27a0: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
27b0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28  ->x.pList;.  if(
27c0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32   pList->nExpr!=2
27d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
27e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
27f0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[1].pExpr->o
2800: 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29  p != TK_COLUMN )
2810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2830: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2840: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2850: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ABLE */../*.** I
2860: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
2870: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
2880: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2890: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
28a0: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
28b0: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
28c0: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
28d0: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
28e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28f0: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
2900: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
2910: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
2920: 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76  e){.  if( pDeriv
2930: 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76  ed ){.    pDeriv
2940: 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61  ed->flags |= pBa
2950: 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  se->flags & EP_F
2960: 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65  romJoin;.    pDe
2970: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
2980: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
2990: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
29a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
29b0: 72 6b 20 74 65 72 6d 20 69 43 68 69 6c 64 20 61  rk term iChild a
29c0: 73 20 62 65 69 6e 67 20 61 20 63 68 69 6c 64 20  s being a child 
29d0: 6f 66 20 74 65 72 6d 20 69 50 61 72 65 6e 74 0a  of term iParent.
29e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
29f0: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 57  arkTermAsChild(W
2a00: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2a10: 20 69 6e 74 20 69 43 68 69 6c 64 2c 20 69 6e 74   int iChild, int
2a20: 20 69 50 61 72 65 6e 74 29 7b 0a 20 20 70 57 43   iParent){.  pWC
2a30: 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69 50 61 72  ->a[iChild].iPar
2a40: 65 6e 74 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20  ent = iParent;. 
2a50: 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e   pWC->a[iChild].
2a60: 74 72 75 74 68 50 72 6f 62 20 3d 20 70 57 43 2d  truthProb = pWC-
2a70: 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74 72 75 74  >a[iParent].trut
2a80: 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d 3e 61 5b  hProb;.  pWC->a[
2a90: 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69 6c 64 2b  iParent].nChild+
2aa0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  +;.}../*.** Retu
2ab0: 72 6e 20 74 68 65 20 4e 2d 74 68 20 41 4e 44 2d  rn the N-th AND-
2ac0: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72  connected subter
2ad0: 6d 20 6f 66 20 70 54 65 72 6d 2e 20 20 4f 72 20  m of pTerm.  Or 
2ae0: 69 66 20 70 54 65 72 6d 20 69 73 20 6e 6f 74 0a  if pTerm is not.
2af0: 2a 2a 20 61 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e  ** a conjunction
2b00: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 6a 75  , then return ju
2b10: 73 74 20 70 54 65 72 6d 20 77 68 65 6e 20 4e 3d  st pTerm when N=
2b20: 3d 30 2e 20 20 49 66 20 4e 20 69 73 20 65 78 63  =0.  If N is exc
2b30: 65 65 64 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  eeds.** the numb
2b40: 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
2b50: 73 75 62 74 65 72 6d 73 2c 20 72 65 74 75 72 6e  subterms, return
2b60: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
2b70: 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72   WhereTerm *wher
2b80: 65 4e 74 68 53 75 62 74 65 72 6d 28 57 68 65 72  eNthSubterm(Wher
2b90: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e  eTerm *pTerm, in
2ba0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 54 65 72  t N){.  if( pTer
2bb0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
2bc0: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 72 65 74 75  _AND ){.    retu
2bd0: 72 6e 20 4e 3d 3d 30 20 3f 20 70 54 65 72 6d 20  rn N==0 ? pTerm 
2be0: 3a 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  : 0;.  }.  if( N
2bf0: 3c 70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  <pTerm->u.pAndIn
2c00: 66 6f 2d 3e 77 63 2e 6e 54 65 72 6d 20 29 7b 0a  fo->wc.nTerm ){.
2c10: 20 20 20 20 72 65 74 75 72 6e 20 26 70 54 65 72      return &pTer
2c20: 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
2c30: 63 2e 61 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72 65  c.a[N];.  }.  re
2c40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2c50: 20 53 75 62 74 65 72 6d 73 20 70 4f 6e 65 20 61   Subterms pOne a
2c60: 6e 64 20 70 54 77 6f 20 61 72 65 20 63 6f 6e 74  nd pTwo are cont
2c70: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 57 48 45  ained within WHE
2c80: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
2c90: 54 68 65 0a 2a 2a 20 74 77 6f 20 73 75 62 74 65  The.** two subte
2ca0: 72 6d 73 20 61 72 65 20 69 6e 20 64 69 73 6a 75  rms are in disju
2cb0: 6e 63 74 69 6f 6e 20 2d 20 74 68 65 79 20 61 72  nction - they ar
2cc0: 65 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  e OR-ed together
2cd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 73 65  ..**.** If these
2ce0: 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 20 62   two terms are b
2cf0: 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  oth of the form:
2d00: 20 20 22 41 20 6f 70 20 42 22 20 77 69 74 68 20    "A op B" with 
2d10: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 41 20 61 6e  the same.** A an
2d20: 64 20 42 20 76 61 6c 75 65 73 20 62 75 74 20 64  d B values but d
2d30: 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f  ifferent operato
2d40: 72 73 20 61 6e 64 20 69 66 20 74 68 65 20 6f 70  rs and if the op
2d50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 63  erators are.** c
2d60: 6f 6d 70 61 74 69 62 6c 65 20 28 69 66 20 6f 6e  ompatible (if on
2d70: 65 20 69 73 20 3d 20 61 6e 64 20 74 68 65 20 6f  e is = and the o
2d80: 74 68 65 72 20 69 73 20 3c 2c 20 66 6f 72 20 65  ther is <, for e
2d90: 78 61 6d 70 6c 65 29 20 74 68 65 6e 0a 2a 2a 20  xample) then.** 
2da0: 61 64 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  add a new virtua
2db0: 6c 20 41 4e 44 20 74 65 72 6d 20 74 6f 20 70 57  l AND term to pW
2dc0: 43 20 74 68 61 74 20 69 73 20 74 68 65 20 63 6f  C that is the co
2dd0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
2de0: 0a 2a 2a 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a 20 53  .** two..**.** S
2df0: 6f 6d 65 20 65 78 61 6d 70 6c 65 73 3a 0a 2a 2a  ome examples:.**
2e00: 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52 20 78 3d  .**    x<y OR x=
2e10: 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 78 3c 3d  y    -->     x<=
2e20: 79 0a 2a 2a 20 20 20 20 78 3d 79 20 4f 52 20 78  y.**    x=y OR x
2e30: 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 78 3d  =y    -->     x=
2e40: 79 0a 2a 2a 20 20 20 20 78 3c 3d 79 20 4f 52 20  y.**    x<=y OR 
2e50: 78 3c 79 20 20 20 2d 2d 3e 20 20 20 20 20 78 3c  x<y   -->     x<
2e60: 3d 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  =y.**.** The fol
2e70: 6c 6f 77 69 6e 67 20 69 73 20 4e 4f 54 20 67 65  lowing is NOT ge
2e80: 6e 65 72 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  nerated:.**.**  
2e90: 20 20 78 3c 79 20 4f 52 20 78 3e 79 20 20 20 20    x<y OR x>y    
2ea0: 2d 2d 3e 20 20 20 20 20 78 21 3d 79 20 20 20 20  -->     x!=y    
2eb0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
2ec0: 20 77 68 65 72 65 43 6f 6d 62 69 6e 65 44 69 73   whereCombineDis
2ed0: 6a 75 6e 63 74 73 28 0a 20 20 53 72 63 4c 69 73  juncts(.  SrcLis
2ee0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
2ef0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
2f00: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
2f10: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
2f20: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
2f30: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2f40: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6e    WhereTerm *pOn
2f50: 65 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  e,       /* Firs
2f60: 74 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a 20 20  t disjunct */.  
2f70: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 77 6f 20  WhereTerm *pTwo 
2f80: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
2f90: 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a 29 7b 0a   disjunct */.){.
2fa0: 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4f 6e 65    u16 eOp = pOne
2fb0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 20 70 54  ->eOperator | pT
2fc0: 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20  wo->eOperator;. 
2fd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2fe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2ff0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28  ase connection (
3000: 66 6f 72 20 6d 61 6c 6c 6f 63 29 20 2a 2f 0a 20  for malloc) */. 
3010: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
3020: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76          /* New v
3030: 69 72 74 75 61 6c 20 65 78 70 72 65 73 73 69 6f  irtual expressio
3040: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3060: 20 4f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   Operator for th
3070: 65 20 63 6f 6d 62 69 6e 65 64 20 65 78 70 72 65  e combined expre
3080: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
3090: 64 78 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  dxNew;          
30a0: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 57    /* Index in pW
30b0: 43 20 6f 66 20 74 68 65 20 6e 65 78 74 20 76 69  C of the next vi
30c0: 72 74 75 61 6c 20 74 65 72 6d 20 2a 2f 0a 0a 20  rtual term */.. 
30d0: 20 69 66 28 20 28 70 4f 6e 65 2d 3e 65 4f 70 65   if( (pOne->eOpe
30e0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
30f0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
3100: 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29 20 72 65  |WO_GE))==0 ) re
3110: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 54 77  turn;.  if( (pTw
3120: 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  o->eOperator & (
3130: 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
3140: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 3d  E|WO_GT|WO_GE))=
3150: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
3160: 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51  f( (eOp & (WO_EQ
3170: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d  |WO_LT|WO_LE))!=
3180: 65 4f 70 0a 20 20 20 26 26 20 28 65 4f 70 20 26  eOp.   && (eOp &
3190: 20 28 57 4f 5f 45 51 7c 57 4f 5f 47 54 7c 57 4f   (WO_EQ|WO_GT|WO
31a0: 5f 47 45 29 29 21 3d 65 4f 70 20 29 20 72 65 74  _GE))!=eOp ) ret
31b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
31c0: 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  One->pExpr->pLef
31d0: 74 21 3d 30 20 26 26 20 70 4f 6e 65 2d 3e 70 45  t!=0 && pOne->pE
31e0: 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29  xpr->pRight!=0 )
31f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 77 6f  ;.  assert( pTwo
3200: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d  ->pExpr->pLeft!=
3210: 30 20 26 26 20 70 54 77 6f 2d 3e 70 45 78 70 72  0 && pTwo->pExpr
3220: 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
3230: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
3240: 43 6f 6d 70 61 72 65 28 70 4f 6e 65 2d 3e 70 45  Compare(pOne->pE
3250: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 54 77 6f  xpr->pLeft, pTwo
3260: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  ->pExpr->pLeft, 
3270: 2d 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  -1) ) return;.  
3280: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
3290: 6f 6d 70 61 72 65 28 70 4f 6e 65 2d 3e 70 45 78  ompare(pOne->pEx
32a0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 70 54 77 6f  pr->pRight, pTwo
32b0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
32c0: 20 2d 31 29 20 29 72 65 74 75 72 6e 3b 0a 20 20   -1) )return;.  
32d0: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
32e0: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
32f0: 61 6e 73 20 74 68 65 20 74 77 6f 20 73 75 62 74  ans the two subt
3300: 65 72 6d 73 20 63 61 6e 20 62 65 20 63 6f 6d 62  erms can be comb
3310: 69 6e 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 65  ined */.  if( (e
3320: 4f 70 20 26 20 28 65 4f 70 2d 31 29 29 21 3d 30  Op & (eOp-1))!=0
3330: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 20   ){.    if( eOp 
3340: 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20  & (WO_LT|WO_LE) 
3350: 29 7b 0a 20 20 20 20 20 20 65 4f 70 20 3d 20 57  ){.      eOp = W
3360: 4f 5f 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  O_LE;.    }else{
3370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
3380: 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  Op & (WO_GT|WO_G
3390: 45 29 20 29 3b 0a 20 20 20 20 20 20 65 4f 70 20  E) );.      eOp 
33a0: 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a 20  = WO_GE;.    }. 
33b0: 20 7d 0a 20 20 64 62 20 3d 20 70 57 43 2d 3e 70   }.  db = pWC->p
33c0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
33d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
33e0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
33f0: 4f 6e 65 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a  One->pExpr, 0);.
3400: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
3410: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 6f 70  return;.  for(op
3420: 3d 54 4b 5f 45 51 3b 20 65 4f 70 21 3d 28 57 4f  =TK_EQ; eOp!=(WO
3430: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
3440: 3b 20 6f 70 2b 2b 29 7b 20 61 73 73 65 72 74 28  ; op++){ assert(
3450: 20 6f 70 3c 54 4b 5f 47 45 20 29 3b 20 7d 0a 20   op<TK_GE ); }. 
3460: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a   pNew->op = op;.
3470: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
3480: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
3490: 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52  , pNew, TERM_VIR
34a0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
34b0: 43 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  C);.  exprAnalyz
34c0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
34d0: 4e 65 77 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  New);.}..#if !de
34e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
34f0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
3500: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
3510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
3520: 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ERY)./*.** Analy
3530: 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63  ze a term that c
3540: 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f  onsists of two o
3550: 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63  r more OR-connec
3560: 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e  ted.** subterms.
3570: 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20    So in:.**.**  
3580: 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61     ... WHERE  (a
3590: 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20  =5) AND (b=7 OR 
35a0: 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44  c=9 OR d=13) AND
35b0: 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20   (d=13).**      
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e      ^^^^^^^^^^^^
35e0: 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54  ^^^^^^^^.**.** T
35f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
3600: 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20  yzes terms such 
3610: 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65  as the middle te
3620: 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  rm in the above 
3630: 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68  example..** A Wh
3640: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
3650: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
3660: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
3670: 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61   term under.** a
3680: 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c  nalysis, regardl
3690: 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
36a0: 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73  me of the analys
36b0: 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a  is.  Hence:.**.*
36c0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
36d0: 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45  wtFlags   |=  TE
36e0: 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20  RM_ORINFO.**    
36f0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
3700: 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d  Info  =  a dynam
3710: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
3720: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
3730: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ect.**.** The te
3740: 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
3750: 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  d must have two 
3760: 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f  or more of OR-co
3770: 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73  nnected subterms
3780: 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75  ..** A single su
3790: 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61  bterm might be a
37a0: 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e   set of AND-conn
37b0: 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72  ected sub-subter
37c0: 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20  ms..** Examples 
37d0: 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61  of terms under a
37e0: 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  nalysis:.**.**  
37f0: 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d     (A)     t1.x=
3800: 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e  t2.y OR t1.x=t2.
3810: 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20  z OR t1.y=15 OR 
3820: 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20  t1.z=t3.a+5.**  
3830: 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70     (B)     x=exp
3840: 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52  r1 OR expr2=x OR
3850: 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20   x=expr3.**     
3860: 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (C)     t1.x=t2.
3870: 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20  y OR (t1.x=t2.z 
3880: 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20  AND t1.y=15).** 
3890: 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78      (D)     x=ex
38a0: 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44  pr1 OR (y>11 AND
38b0: 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45   y<22 AND z LIKE
38c0: 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20   '*hello*').**  
38d0: 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d     (E)     (p.a=
38e0: 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20  1 AND q.b=2 AND 
38f0: 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34  r.c=3) OR (p.x=4
3900: 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72   AND q.y=5 AND r
3910: 2e 7a 3d 36 29 0a 2a 2a 20 20 20 20 20 28 46 29  .z=6).**     (F)
3920: 20 20 20 20 20 78 3e 41 20 4f 52 20 28 78 3d 41       x>A OR (x=A
3930: 20 41 4e 44 20 79 3e 3d 42 29 0a 2a 2a 0a 2a 2a   AND y>=B).**.**
3940: 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 1:.**.** I
3950: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
3960: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54  re of the form T
3970: 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65  .C=expr for some
3980: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
3990: 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20 73 69 6e  f C and.** a sin
39a0: 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20  gle table T (as 
39b0: 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65  shown in example
39c0: 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63   B above) then c
39d0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
39e0: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ual.** term that
39f0: 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   is an equivalen
3a00: 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  t IN expression.
3a10: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
3a20: 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a  , if the term.**
3a30: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
3a40: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
3a50: 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78   = expr1  OR  ex
3a60: 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d  pr2 = x  OR  x =
3a70: 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65   expr3.**.** the
3a80: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
3a90: 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65  irtual term like
3aa0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
3ab0: 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78    x IN (expr1,ex
3ac0: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a  pr2,expr3).**.**
3ad0: 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 2:.**.** I
3ae0: 66 20 74 68 65 72 65 20 61 72 65 20 65 78 61 63  f there are exac
3af0: 74 6c 79 20 74 77 6f 20 64 69 73 6a 75 6e 63 74  tly two disjunct
3b00: 73 20 61 6e 64 20 6f 6e 65 20 73 69 64 65 20 68  s and one side h
3b10: 61 73 20 78 3e 41 20 61 6e 64 20 74 68 65 20 6f  as x>A and the o
3b20: 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 68 61 73  ther side.** has
3b30: 20 78 3d 41 20 28 66 6f 72 20 74 68 65 20 73 61   x=A (for the sa
3b40: 6d 65 20 78 20 61 6e 64 20 41 29 20 74 68 65 6e  me x and A) then
3b50: 20 61 64 64 20 61 20 6e 65 77 20 76 69 72 74 75   add a new virtu
3b60: 61 6c 20 63 6f 6e 6a 75 6e 63 74 20 74 65 72 6d  al conjunct term
3b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
3b80: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
3b90: 6f 72 6d 20 22 78 3e 3d 41 22 2e 20 20 45 78 61  orm "x>=A".  Exa
3ba0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
3bb0: 20 78 3e 41 20 4f 52 20 28 78 3d 41 20 41 4e 44   x>A OR (x=A AND
3bc0: 20 79 3e 42 29 20 20 20 20 61 64 64 73 3a 20 20   y>B)    adds:  
3bd0: 20 20 78 3e 3d 41 0a 2a 2a 0a 2a 2a 20 54 68 65    x>=A.**.** The
3be0: 20 61 64 64 65 64 20 63 6f 6e 6a 75 6e 63 74 20   added conjunct 
3bf0: 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65  can sometimes be
3c00: 20 68 65 6c 70 66 75 6c 20 69 6e 20 71 75 65 72   helpful in quer
3c10: 79 20 70 6c 61 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a  y planning..**.*
3c20: 2a 20 43 41 53 45 20 33 3a 0a 2a 2a 0a 2a 2a 20  * CASE 3:.**.** 
3c30: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
3c40: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
3c50: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
3c60: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
3c70: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
3c80: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
3c90: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
3ca0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
3cb0: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
3cc0: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
3cd0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
3ce0: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
3cf0: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
3d00: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
3d10: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
3d20: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
3d30: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
3d40: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
3d50: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
3d60: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
3d70: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
3d80: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
3d90: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
3da0: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
3db0: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
3dc0: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
3dd0: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
3de0: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
3df0: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
3e00: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
3e10: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
3e20: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
3e30: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
3e40: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
3e50: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
3e60: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
3e70: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
3e80: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
3e90: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
3ea0: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
3eb0: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
3ec0: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
3ed0: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
3ee0: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
3ef0: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
3f00: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
3f10: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
3f20: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
3f30: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
3f40: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
3f50: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
3f60: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
3f70: 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65 64 20  t.** is decided 
3f80: 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68 69 73  elsewhere.  This
3f90: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 6c   analysis only l
3fa0: 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20  ooks at whether 
3fb0: 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70 70 72  subterms.** appr
3fc0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
3fd0: 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a  xing exist..**.*
3fe0: 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41  * All examples A
3ff0: 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65   through E above
4000: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 33 2e   satisfy case 3.
4010: 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a    But if a term.
4020: 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66 69 65  ** also satisfie
4030: 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61  s case 1 (such a
4040: 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61  s B) we know tha
4050: 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  t the optimizer 
4060: 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70  will.** always p
4070: 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f  refer case 1, so
4080: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65   in that case we
4090: 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61   pretend that ca
40a0: 73 65 20 33 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  se 3 is not.** s
40b0: 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  atisfied..**.** 
40c0: 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  It might be the 
40d0: 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70  case that multip
40e0: 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e  le tables are in
40f0: 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78  dexable.  For ex
4100: 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62  ample,.** (E) ab
4110: 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ove is indexable
4120: 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c   on tables P, Q,
4130: 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65   and R..**.** Te
4140: 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79  rms that satisfy
4150: 20 63 61 73 65 20 33 20 61 72 65 20 63 61 6e 64   case 3 are cand
4160: 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75  idates for looku
4170: 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65  p by using.** se
4180: 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74  parate indices t
4190: 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f  o find rowids fo
41a0: 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61  r each subterm a
41b0: 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20  nd composing.** 
41c0: 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c  the union of all
41d0: 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20   rowids using a 
41e0: 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  RowSet object.  
41f0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a  This is similar.
4200: 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e  ** to "bitmap in
4210: 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20  dices" in other 
4220: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73  database engines
4230: 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53  ..**.** OTHERWIS
4240: 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  E:.**.** If none
4250: 20 6f 66 20 63 61 73 65 73 20 31 2c 20 32 2c 20   of cases 1, 2, 
4260: 6f 72 20 33 20 61 70 70 6c 79 2c 20 74 68 65 6e  or 3 apply, then
4270: 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72   leave the eOper
4280: 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a  ator set to.** z
4290: 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20  ero.  This term 
42a0: 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f  is not useful fo
42b0: 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  r search..*/.sta
42c0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
42d0: 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72  lyzeOrTerm(.  Sr
42e0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
4300: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
4310: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
4320: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
4330: 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20   complete WHERE 
4340: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
4350: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
4360: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
4370: 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f  f the OR-term to
4380: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
4390: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
43a0: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
43b0: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  Info;        /* 
43c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
43d0: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
43e0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
43f0: 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
4400: 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rse;         /* 
4410: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4420: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
4430: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
4440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4450: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
4460: 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
4470: 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
4480: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20  >a[idxTerm];    
4490: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
44a0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
44b0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
44c0: 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20  erm->pExpr;     
44d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
44e0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
44f0: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
4500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
4530: 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ers */.  WhereCl
4540: 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
4550: 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66     /* Breakup of
4560: 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74   pTerm into subt
4570: 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54  erms */.  WhereT
4580: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20  erm *pOrTerm;   
4590: 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72      /* A Sub-ter
45a0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72  m within the pOr
45b0: 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49  Wc */.  WhereOrI
45c0: 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20  nfo *pOrInfo;   
45d0: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
45e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f  information asso
45f0: 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72  ciated with pTer
4600: 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63  m */.  Bitmask c
4610: 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20  hngToIN;        
4620: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
4630: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
4640: 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73  se 1 */.  Bitmas
4650: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
4660: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
4670: 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  at are indexable
4680: 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73  , satisfying cas
4690: 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  e 2 */..  /*.  *
46a0: 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63  * Break the OR c
46b0: 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73  lause into its s
46c0: 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73  eparate subterms
46d0: 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20  .  The subterms 
46e0: 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  are.  ** stored 
46f0: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
4700: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
4710: 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65  ining within the
4720: 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a   WhereOrInfo.  *
4730: 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  * object that is
4740: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
4750: 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61   original OR cla
4760: 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20  use term..  */. 
4770: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
4780: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
4790: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52  _DYNAMIC|TERM_OR
47a0: 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46  INFO|TERM_ANDINF
47b0: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  O))==0 );.  asse
47c0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
47d0: 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d  K_OR );.  pTerm-
47e0: 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72  >u.pOrInfo = pOr
47f0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
4800: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
4810: 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29  izeof(*pOrInfo))
4820: 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d  ;.  if( pOrInfo=
4830: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
4840: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
4850: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20   TERM_ORINFO;.  
4860: 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f  pOrWc = &pOrInfo
4870: 2d 3e 77 63 3b 0a 20 20 73 71 6c 69 74 65 33 57  ->wc;.  sqlite3W
4880: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
4890: 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  OrWc, pWInfo);. 
48a0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c   sqlite3WhereSpl
48b0: 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c  it(pOrWc, pExpr,
48c0: 20 54 4b 5f 4f 52 29 3b 0a 20 20 73 71 6c 69 74   TK_OR);.  sqlit
48d0: 65 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79  e3WhereExprAnaly
48e0: 7a 65 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ze(pSrc, pOrWc);
48f0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
4900: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
4910: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
4920: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
4930: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
4940: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
4950: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
4960: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
4970: 72 20 33 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 3..  */.  inde
4980: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
4990: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
49a0: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
49b0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
49c0: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
49d0: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
49e0: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
49f0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
4a00: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
4a10: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
4a20: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
4a30: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
4a40: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
4a50: 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d  assert( (pOrTerm
4a60: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
4a70: 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f  M_ANDINFO|TERM_O
4a80: 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  RINFO))==0 );.  
4a90: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
4aa0: 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f  ;.      pAndInfo
4ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4ac0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
4ad0: 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20  (*pAndInfo));.  
4ae0: 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f      if( pAndInfo
4af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
4b00: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b  eClause *pAndWC;
4b10: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
4b20: 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20  rm *pAndTerm;.  
4b30: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
4b40: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
4b50: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   0;.        pOrT
4b60: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20  erm->u.pAndInfo 
4b70: 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20  = pAndInfo;.    
4b80: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
4b90: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44  lags |= TERM_AND
4ba0: 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f  INFO;.        pO
4bb0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
4bc0: 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20   = WO_AND;.     
4bd0: 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e     pAndWC = &pAn
4be0: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
4bf0: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
4c00: 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43  lauseInit(pAndWC
4c10: 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29 3b 0a  , pWC->pWInfo);.
4c20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
4c30: 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43  hereSplit(pAndWC
4c40: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
4c50: 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20  , TK_AND);.     
4c60: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
4c70: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
4c80: 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20   pAndWC);.      
4c90: 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72    pAndWC->pOuter
4ca0: 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
4cb0: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61  testcase( db->ma
4cc0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
4cd0: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
4ce0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4cf0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
4d00: 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57  , pAndTerm=pAndW
4d10: 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e  C->a; j<pAndWC->
4d20: 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64  nTerm; j++, pAnd
4d30: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
4d40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e       assert( pAn
4d50: 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  dTerm->pExpr );.
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
4d70: 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65  allowedOp(pAndTe
4d80: 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29  rm->pExpr->op) )
4d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4da0: 62 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  b |= sqlite3Wher
4db0: 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
4dc0: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  ->sMaskSet, pAnd
4dd0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
4de0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
4df0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
4e10: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
4e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4e30: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
4e40: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
4e50: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
4e60: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
4e70: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
4e80: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
4e90: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
4ea0: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
4eb0: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
4ec0: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
4ed0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
4ee0: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 73 71 6c  b;.      b = sql
4ef0: 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
4f00: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
4f10: 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  et, pOrTerm->lef
4f20: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
4f30: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
4f40: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
4f50: 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57  UAL ){.        W
4f60: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
4f70: 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72   = &pOrWc->a[pOr
4f80: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
4f90: 20 20 20 20 20 20 20 20 62 20 7c 3d 20 73 71 6c          b |= sql
4fa0: 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
4fb0: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
4fc0: 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74  et, pOther->left
4fd0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
4fe0: 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65  .      indexable
4ff0: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28   &= b;.      if(
5000: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
5010: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30  ator & WO_EQ)==0
5020: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
5030: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
5040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
5050: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
5060: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5070: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
5080: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
5090: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
50a0: 20 63 61 73 65 20 33 2e 20 20 54 68 65 20 73 65   case 3.  The se
50b0: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
50c0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
50d0: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
50e0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
50f0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
5100: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
5110: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
5120: 2f 2a 20 46 6f 72 20 61 20 74 77 6f 2d 77 61 79  /* For a two-way
5130: 20 4f 52 2c 20 61 74 74 65 6d 70 74 20 74 6f 20   OR, attempt to 
5140: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63  implementation c
5150: 61 73 65 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 66  ase 2..  */.  if
5160: 28 20 69 6e 64 65 78 61 62 6c 65 20 26 26 20 70  ( indexable && p
5170: 4f 72 57 63 2d 3e 6e 54 65 72 6d 3d 3d 32 20 29  OrWc->nTerm==2 )
5180: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 6e 65 20 3d  {.    int iOne =
5190: 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
51a0: 6d 20 2a 70 4f 6e 65 3b 0a 20 20 20 20 77 68 69  m *pOne;.    whi
51b0: 6c 65 28 20 28 70 4f 6e 65 20 3d 20 77 68 65 72  le( (pOne = wher
51c0: 65 4e 74 68 53 75 62 74 65 72 6d 28 26 70 4f 72  eNthSubterm(&pOr
51d0: 57 63 2d 3e 61 5b 30 5d 2c 69 4f 6e 65 2b 2b 29  Wc->a[0],iOne++)
51e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )!=0 ){.      in
51f0: 74 20 69 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20  t iTwo = 0;.    
5200: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 77    WhereTerm *pTw
5210: 6f 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  o;.      while( 
5220: 28 70 54 77 6f 20 3d 20 77 68 65 72 65 4e 74 68  (pTwo = whereNth
5230: 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e  Subterm(&pOrWc->
5240: 61 5b 31 5d 2c 69 54 77 6f 2b 2b 29 29 21 3d 30  a[1],iTwo++))!=0
5250: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72   ){.        wher
5260: 65 43 6f 6d 62 69 6e 65 44 69 73 6a 75 6e 63 74  eCombineDisjunct
5270: 73 28 70 53 72 63 2c 20 70 57 43 2c 20 70 4f 6e  s(pSrc, pWC, pOn
5280: 65 2c 20 70 54 77 6f 29 3b 0a 20 20 20 20 20 20  e, pTwo);.      
5290: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
52a0: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
52b0: 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74  holds a set of t
52c0: 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68  ables that *migh
52d0: 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20  t* satisfy case 
52e0: 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20  1.  But.  ** we 
52f0: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
5300: 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b  additional check
5310: 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61  ing to see if ca
5320: 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a  se 1 really.  **
5330: 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20   is satisfied.. 
5340: 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   **.  ** chngToI
5350: 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68  N will hold eith
5360: 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69  er 0, 1, or 2 bi
5370: 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63  ts.  The 0-bit c
5380: 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  ase means.  ** t
5390: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
53a0: 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74  possibility of t
53b0: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20  ransforming the 
53c0: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61  OR clause into a
53d0: 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74  n.  ** IN operat
53e0: 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  or because one o
53f0: 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20  r more terms in 
5400: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f  the OR clause co
5410: 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74  ntain.  ** somet
5420: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
5430: 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69  == on a column i
5440: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62  n the single tab
5450: 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20  le.  The 1-bit. 
5460: 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74   ** case means t
5470: 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f  hat every term o
5480: 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  f the OR clause 
5490: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20  is of the form. 
54a0: 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d   ** "table.colum
54b0: 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65  n=expr" for some
54c0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
54d0: 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74  The one bit that
54e0: 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c   is set.  ** wil
54f0: 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  l correspond to 
5500: 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  the common table
5510: 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64  .  We still need
5520: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b   to check to mak
5530: 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20  e.  ** sure the 
5540: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75  same column is u
5550: 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  sed on all terms
5560: 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73  .  The 2-bit cas
5570: 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  e is when.  ** t
5580: 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65  he all terms are
5590: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
55a0: 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c  ble1.column=tabl
55b0: 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a  e2.column".  It.
55c0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f    ** might be po
55d0: 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61  ssible to form a
55e0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
55f0: 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31  th either table1
5600: 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20  .column.  ** or 
5610: 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73  table2.column as
5620: 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68   the LHS if eith
5630: 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  er is common to 
5640: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20  every term of.  
5650: 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ** the OR clause
5660: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
5670: 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74   that terms of t
5680: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63  he form "table.c
5690: 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c  olumn1=table.col
56a0: 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20  umn2" (the.  ** 
56b0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f  same table on bo
56c0: 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20  th sizes of the 
56d0: 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ==) cannot be op
56e0: 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  timized..  */.  
56f0: 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a  if( chngToIN ){.
5700: 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67      int okToChng
5710: 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ToIN = 0;     /*
5720: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
5730: 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73  version to IN is
5740: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e   valid */.    in
5750: 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20  t iColumn = -1; 
5760: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
5770: 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f  n index on lhs o
5780: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
5790: 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72  .    int iCursor
57a0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
57b0: 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63  * Table cursor c
57c0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72  ommon to all ter
57d0: 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  ms */.    int j 
57e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
57f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
5800: 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ter */..    /* S
5810: 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c  earch for a tabl
5820: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61  e and column tha
5830: 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65  t appears on one
5840: 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
5850: 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65   ** other of the
5860: 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   == operator in 
5870: 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20  every subterm.  
5880: 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63  That table and c
5890: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c  olumn.    ** wil
58a0: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
58b0: 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f   iCursor and iCo
58c0: 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67  lumn.  There mig
58d0: 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20  ht not be any.  
58e0: 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20    ** such table 
58f0: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74  and column.  Set
5900: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66   okToChngToIN if
5910: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
5920: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64  table.    ** and
5930: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64   column is found
5940: 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43   but leave okToC
5950: 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66  hngToIN false if
5960: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20   not found..    
5970: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
5980: 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67  j<2 && !okToChng
5990: 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ToIN; j++){.    
59a0: 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57    pOrTerm = pOrW
59b0: 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  c->a;.      for(
59c0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
59d0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
59e0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
59f0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
5a00: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
5a10: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
5a20: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
5a30: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
5a40: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
5a50: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
5a60: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
5a70: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
5a80: 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   the 2-bit case 
5a90: 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68  and we are on th
5aa0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
5ab0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  on and.         
5ac0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d   ** current term
5ad0: 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72   is from the fir
5ae0: 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53  st iteration.  S
5af0: 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d  o skip this term
5b00: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
5b10: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
5b20: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
5b30: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
5b40: 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f       if( (chngTo
5b50: 49 4e 20 26 20 73 71 6c 69 74 65 33 57 68 65 72  IN & sqlite3Wher
5b60: 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
5b70: 2d 3e 73 4d 61 73 6b 53 65 74 2c 0a 20 20 20 20  ->sMaskSet,.    
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
5bb0: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
5bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5bd0: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
5be0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
5bf0: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
5c00: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
5c10: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
5c20: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
5c30: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
5c40: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
5c50: 70 72 65 63 65 64 65 64 0a 20 20 20 20 20 20 20  preceded.       
5c60: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
5c70: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
5c80: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
5c90: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
5ca0: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
5cb0: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
5cc0: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
5cd0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
5ce0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
5cf0: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
5d00: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
5d10: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
5d20: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
5d30: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
5d40: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
5d50: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
5d60: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
5d70: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
5d80: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
5d90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5da0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
5db0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
5dc0: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
5dd0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
5de0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
5df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5e00: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
5e10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
5e20: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
5e30: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
5e40: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
5e50: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
5e60: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
5e70: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
5e80: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
5e90: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5ea0: 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
5eb0: 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20  (chngToIN) );.  
5ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68        assert( ch
5ed0: 6e 67 54 6f 49 4e 3d 3d 73 71 6c 69 74 65 33 57  ngToIN==sqlite3W
5ee0: 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
5ef0: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69  nfo->sMaskSet, i
5f00: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
5f10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5f20: 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
5f30: 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  ( j==1 );..     
5f40: 20 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e   /* We have foun
5f50: 64 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61  d a candidate ta
5f60: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20  ble and column. 
5f70: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
5f80: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74   that.      ** t
5f90: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
5fa0: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
5fb0: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f  ry term in the O
5fc0: 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  R clause */.    
5fd0: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
5fe0: 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20   1;.      for(; 
5ff0: 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67  i>=0 && okToChng
6000: 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  ToIN; i--, pOrTe
6010: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
6020: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
6030: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
6040: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Q );.        if(
6050: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
6060: 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b  rsor!=iCursor ){
6070: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65  .          pOrTe
6080: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e  rm->wtFlags &= ~
6090: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
60a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
60b0: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
60c0: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn!=iColumn ){.
60d0: 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68            okToCh
60e0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
60f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6100: 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74       int affLeft
6110: 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20  , affRight;.    
6120: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
6130: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
6140: 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e  is also a column
6150: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
6160: 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ities.          
6170: 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74  ** of both right
6180: 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20   and left sides 
6190: 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68 61  must be such tha
61a0: 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20  t no type.      
61b0: 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f      ** conversio
61c0: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
61d0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20 28  on the right.  (
61e0: 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20  Ticket #2249).  
61f0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
6200: 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d 20       affRight = 
6210: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
6220: 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ity(pOrTerm->pEx
6230: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
6240: 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d         affLeft =
6250: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
6260: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
6270: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
6280: 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52 69         if( affRi
6290: 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69 67  ght!=0 && affRig
62a0: 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20  ht!=affLeft ){. 
62b0: 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43             okToC
62c0: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
62d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
62e0: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
62f0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
6300: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
6310: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6320: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
6330: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
6340: 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  int, okToChngToI
6350: 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72 69  N is true if ori
6360: 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69  ginal pTerm sati
6370: 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73  sfies.    ** cas
6380: 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61  e 1.  In that ca
6390: 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20  se, construct a 
63a0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
63b0: 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a   that is .    **
63c0: 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64   pTerm converted
63d0: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
63e0: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
63f0: 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   if( okToChngToI
6400: 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
6410: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
6420: 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74    /* A transient
6430: 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72 65   duplicate expre
6440: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
6450: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
6460: 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53   0;   /* The RHS
6470: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
6480: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
6490: 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20  r *pLeft = 0;   
64a0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f      /* The LHS o
64b0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
64c0: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
64d0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
64e0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
64f0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
6500: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ..      for(i=pO
6510: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
6520: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
6530: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
6540: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
6550: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  f( (pOrTerm->wtF
6560: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f  lags & TERM_OR_O
6570: 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  K)==0 ) continue
6580: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6590: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
65a0: 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a  ator & WO_EQ );.
65b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
65c0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
65d0: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a  sor==iCursor );.
65e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
65f0: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
6600: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
6610: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
6620: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6630: 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  db, pOrTerm->pEx
6640: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
6650: 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
6660: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6670: 70 70 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50  ppend(pWInfo->pP
6680: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
6690: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
66a0: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
66b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
66c0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
66d0: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
66e0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
66f0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
6700: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
6710: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
6720: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
6730: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
6740: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
6750: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
6760: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
6770: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
6780: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
6790: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
67a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
67b0: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
67c0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
67d0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
67e0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
67f0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
6800: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
6810: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
6820: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
6830: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
6840: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
6850: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
6860: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
6870: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
6880: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
6890: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
68a0: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
68b0: 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64  (pWC, idxNew, id
68c0: 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  xTerm);.      }e
68d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
68e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
68f0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
6900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
6910: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
6920: 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73  WO_NOOP;  /* cas
6930: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
6940: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  3 */.    }.  }.}
6950: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
6960: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
6970: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
6980: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6990: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 6c   */../*.** We al
69a0: 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74 20  ready know that 
69b0: 70 45 78 70 72 20 69 73 20 61 20 62 69 6e 61 72  pExpr is a binar
69c0: 79 20 6f 70 65 72 61 74 6f 72 20 77 68 65 72 65  y operator where
69d0: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61   both operands a
69e0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65 66  re.** column ref
69f0: 65 72 65 6e 63 65 73 2e 20 20 54 68 69 73 20 72  erences.  This r
6a00: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 6f  outine checks to
6a10: 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
6a20: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 63 65 0a   an equivalence.
6a30: 2a 2a 20 72 65 6c 61 74 69 6f 6e 3a 0a 2a 2a 20  ** relation:.** 
6a40: 20 20 31 2e 20 20 54 68 65 20 53 51 4c 49 54 45    1.  The SQLITE
6a50: 5f 54 72 61 6e 73 69 74 69 76 65 20 6f 70 74 69  _Transitive opti
6a60: 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  mization must be
6a70: 20 65 6e 61 62 6c 65 64 0a 2a 2a 20 20 20 32 2e   enabled.**   2.
6a80: 20 20 4d 75 73 74 20 62 65 20 65 69 74 68 65 72    Must be either
6a90: 20 61 6e 20 3d 3d 20 6f 72 20 61 6e 20 49 53 20   an == or an IS 
6aa0: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 20 20 33 2e  operator.**   3.
6ab0: 20 20 4e 6f 74 20 6f 72 69 67 69 6e 61 74 69 6e    Not originatin
6ac0: 67 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  g in the ON clau
6ad0: 73 65 20 6f 66 20 61 6e 20 4f 55 54 45 52 20 4a  se of an OUTER J
6ae0: 4f 49 4e 0a 2a 2a 20 20 20 34 2e 20 20 54 68 65  OIN.**   4.  The
6af0: 20 61 66 66 69 6e 69 74 69 65 73 20 6f 66 20 41   affinities of A
6b00: 20 61 6e 64 20 42 20 6d 75 73 74 20 62 65 20 63   and B must be c
6b10: 6f 6d 70 61 74 69 62 6c 65 0a 2a 2a 20 20 20 35  ompatible.**   5
6b20: 61 2e 20 42 6f 74 68 20 6f 70 65 72 61 6e 64 73  a. Both operands
6b30: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 63 6f   use the same co
6b40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
6b50: 20 4f 52 0a 2a 2a 20 20 20 35 62 2e 20 54 68 65   OR.**   5b. The
6b60: 20 6f 76 65 72 61 6c 6c 20 63 6f 6c 6c 61 74 69   overall collati
6b70: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 42  ng sequence is B
6b80: 49 4e 41 52 59 0a 2a 2a 20 49 66 20 74 68 69 73  INARY.** If this
6b90: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6ba0: 20 54 52 55 45 2c 20 74 68 61 74 20 6d 65 61 6e   TRUE, that mean
6bb0: 73 20 74 68 61 74 20 74 68 65 20 52 48 53 20 63  s that the RHS c
6bc0: 61 6e 20 62 65 20 73 75 62 73 74 69 74 75 74 65  an be substitute
6bd0: 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 4c 48 53  d.** for the LHS
6be0: 20 61 6e 79 70 6c 61 63 65 20 65 6c 73 65 20 69   anyplace else i
6bf0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
6c00: 73 65 20 77 68 65 72 65 20 74 68 65 20 4c 48 53  se where the LHS
6c10: 20 63 6f 6c 75 6d 6e 20 6f 63 63 75 72 73 2e 0a   column occurs..
6c20: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
6c30: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4e 6f 20  timization.  No 
6c40: 68 61 72 6d 20 63 6f 6d 65 73 20 66 72 6f 6d 20  harm comes from 
6c50: 72 65 74 75 72 6e 69 6e 67 20 30 2e 20 20 42 75  returning 0.  Bu
6c60: 74 20 69 66 20 31 20 69 73 0a 2a 2a 20 72 65 74  t if 1 is.** ret
6c70: 75 72 6e 65 64 20 77 68 65 6e 20 69 74 20 73 68  urned when it sh
6c80: 6f 75 6c 64 20 6e 6f 74 20 62 65 2c 20 74 68 65  ould not be, the
6c90: 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77  n incorrect answ
6ca0: 65 72 73 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ers might result
6cb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6cc0: 74 65 72 6d 49 73 45 71 75 69 76 61 6c 65 6e 63  termIsEquivalenc
6cd0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6ce0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
6cf0: 20 63 68 61 72 20 61 66 66 31 2c 20 61 66 66 32   char aff1, aff2
6d00: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
6d10: 6c 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ll;.  const char
6d20: 20 2a 7a 43 6f 6c 6c 31 2c 20 2a 7a 43 6f 6c 6c   *zColl1, *zColl
6d30: 32 3b 0a 20 20 69 66 28 20 21 4f 70 74 69 6d 69  2;.  if( !Optimi
6d40: 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
6d50: 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
6d60: 5f 54 72 61 6e 73 69 74 69 76 65 29 20 29 20 72  _Transitive) ) r
6d70: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
6d80: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
6d90: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
6da0: 5f 49 53 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  _IS ) return 0;.
6db0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6dc0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
6dd0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
6de0: 72 6e 20 30 3b 0a 20 20 61 66 66 31 20 3d 20 73  rn 0;.  aff1 = s
6df0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
6e00: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
6e10: 3b 0a 20 20 61 66 66 32 20 3d 20 73 71 6c 69 74  ;.  aff2 = sqlit
6e20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
6e30: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
6e40: 20 69 66 28 20 61 66 66 31 21 3d 61 66 66 32 0a   if( aff1!=aff2.
6e50: 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
6e60: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
6e70: 28 61 66 66 31 29 20 7c 7c 20 21 73 71 6c 69 74  (aff1) || !sqlit
6e80: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
6e90: 69 74 79 28 61 66 66 32 29 29 0a 20 20 29 7b 0a  ity(aff2)).  ){.
6ea0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6eb0: 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  }.  pColl = sqli
6ec0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
6ed0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6ee0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
6ef0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
6f00: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( pColl==0 || 
6f10: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
6f20: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 42 49  Coll->zName, "BI
6f30: 4e 41 52 59 22 29 3d 3d 30 20 29 20 72 65 74 75  NARY")==0 ) retu
6f40: 72 6e 20 31 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20  rn 1;.  pColl = 
6f50: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
6f60: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
6f70: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 2f 2a 20 53  ->pLeft);.  /* S
6f80: 69 6e 63 65 20 70 4c 65 66 74 20 61 6e 64 20 70  ince pLeft and p
6f90: 52 69 67 68 74 20 61 72 65 20 62 6f 74 68 20 61  Right are both a
6fa0: 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
6fb0: 65 73 2c 20 74 68 65 69 72 20 63 6f 6c 6c 61 74  es, their collat
6fc0: 69 6e 67 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  ing.  ** sequenc
6fd0: 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
6fe0: 62 65 20 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20  be defined. */. 
6ff0: 20 7a 43 6f 6c 6c 31 20 3d 20 41 4c 57 41 59 53   zColl1 = ALWAYS
7000: 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d  (pColl) ? pColl-
7010: 3e 7a 4e 61 6d 65 20 3a 20 30 3b 0a 20 20 70 43  >zName : 0;.  pC
7020: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
7030: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
7040: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
7050: 0a 20 20 7a 43 6f 6c 6c 32 20 3d 20 41 4c 57 41  .  zColl2 = ALWA
7060: 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
7070: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 30 3b 0a 20 20  l->zName : 0;.  
7080: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74  return sqlite3St
7090: 72 49 43 6d 70 28 7a 43 6f 6c 6c 31 2c 20 7a 43  rICmp(zColl1, zC
70a0: 6f 6c 6c 32 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  oll2)==0;.}../*.
70b0: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77  ** Recursively w
70c0: 61 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69  alk the expressi
70d0: 6f 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ons of a SELECT 
70e0: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 65  statement and ge
70f0: 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d  nerate.** a bitm
7100: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
7110: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
7120: 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70  used in that exp
7130: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e  ression.** tree.
7140: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
7150: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 55 73 61  sk exprSelectUsa
7160: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
7170: 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63  *pMaskSet, Selec
7180: 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73  t *pS){.  Bitmas
7190: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68  k mask = 0;.  wh
71a0: 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20 53  ile( pS ){.    S
71b0: 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
71c0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 6d 61 73  S->pSrc;.    mas
71d0: 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  k |= sqlite3Wher
71e0: 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
71f0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
7200: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
7210: 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
7220: 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
7230: 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70  kSet, pS->pGroup
7240: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
7250: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
7260: 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
7270: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
7280: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
7290: 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
72a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
72b0: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
72c0: 20 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33   mask |= sqlite3
72d0: 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70  WhereExprUsage(p
72e0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
72f0: 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 41  ving);.    if( A
7300: 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20 29  LWAYS(pSrc!=0) )
7310: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
7320: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7330: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
7340: 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c  {.        mask |
7350: 3d 20 65 78 70 72 53 65 6c 65 63 74 55 73 61 67  = exprSelectUsag
7360: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63  e(pMaskSet, pSrc
7370: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
7380: 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  .        mask |=
7390: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
73a0: 72 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  rUsage(pMaskSet,
73b0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
73c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
73d0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
73e0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
73f0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
7400: 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
7410: 72 20 69 73 20 6f 6e 65 20 6f 70 65 72 61 6e 64  r is one operand
7420: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
7430: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 20 6d   operator that m
7440: 69 67 68 74 0a 2a 2a 20 62 65 20 75 73 65 66 75  ight.** be usefu
7450: 6c 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 2e 20  l for indexing. 
7460: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
7470: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70  ecks to see if p
7480: 45 78 70 72 20 61 70 70 65 61 72 73 0a 2a 2a 20  Expr appears.** 
7490: 69 6e 20 61 6e 79 20 69 6e 64 65 78 2e 20 20 52  in any index.  R
74a0: 65 74 75 72 6e 20 54 52 55 45 20 28 31 29 20 69  eturn TRUE (1) i
74b0: 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 69 6e  f pExpr is an in
74c0: 64 65 78 65 64 20 74 65 72 6d 20 61 6e 64 20 72  dexed term and r
74d0: 65 74 75 72 6e 0a 2a 2a 20 46 41 4c 53 45 20 28  eturn.** FALSE (
74e0: 30 29 20 69 66 20 6e 6f 74 2e 20 20 49 66 20 54  0) if not.  If T
74f0: 52 55 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c  RUE is returned,
7500: 20 61 6c 73 6f 20 73 65 74 20 2a 70 69 43 75 72   also set *piCur
7510: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   to the cursor.*
7520: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * number of the 
7530: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
7540: 64 65 78 65 64 20 61 6e 64 20 2a 70 69 43 6f 6c  dexed and *piCol
7550: 75 6d 6e 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  umn to the colum
7560: 6e 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74  n number.** of t
7570: 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69  he column that i
7580: 73 20 69 6e 64 65 78 65 64 2c 20 6f 72 20 2d 32  s indexed, or -2
7590: 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   if an expressio
75a0: 6e 20 69 73 20 62 65 69 6e 67 20 69 6e 64 65 78  n is being index
75b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ed..**.** If pEx
75c0: 70 72 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55 4d  pr is a TK_COLUM
75d0: 4e 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  N column referen
75e0: 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ce, then this ro
75f0: 75 74 69 6e 65 20 61 6c 77 61 79 73 20 72 65 74  utine always ret
7600: 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 65 76 65  urns.** true eve
7610: 6e 20 69 66 20 74 68 61 74 20 70 61 72 74 69 63  n if that partic
7620: 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 73 20 6e  ular column is n
7630: 6f 74 20 69 6e 64 65 78 65 64 2c 20 62 65 63 61  ot indexed, beca
7640: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a  use the column.*
7650: 2a 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64  * might be added
7660: 20 74 6f 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   to an automatic
7670: 20 69 6e 64 65 78 20 6c 61 74 65 72 2e 0a 2a 2f   index later..*/
7680: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7690: 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64 28 0a  MightBeIndexed(.
76a0: 20 20 53 72 63 4c 69 73 74 20 2a 70 46 72 6f 6d    SrcList *pFrom
76b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
76c0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
76d0: 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
76e0: 2c 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  ,       /* Bitma
76f0: 73 6b 20 6f 66 20 46 52 4f 4d 20 63 6c 61 75 73  sk of FROM claus
7700: 65 20 74 65 72 6d 73 20 72 65 66 65 72 65 6e 63  e terms referenc
7710: 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 20  ed by pExpr */. 
7720: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
7730: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70          /* An op
7740: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
7750: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a  rison operator *
7760: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 75 72 2c 20  /.  int *piCur, 
7770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
7780: 69 74 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ite the referenc
7790: 65 64 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  ed table cursor 
77a0: 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
77b0: 20 69 6e 74 20 2a 70 69 43 6f 6c 75 6d 6e 20 20   int *piColumn  
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
77d0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
77e0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  table column num
77f0: 62 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ber here */.){. 
7800: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
7810: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 43 75  int i;.  int iCu
7820: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
7830: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
7840: 0a 20 20 20 20 2a 70 69 43 75 72 20 3d 20 70 45  .    *piCur = pE
7850: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
7860: 20 2a 70 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78   *piColumn = pEx
7870: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
7880: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
7890: 20 69 66 28 20 6d 50 72 65 72 65 71 3d 3d 30 20   if( mPrereq==0 
78a0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
78c0: 6f 20 74 61 62 6c 65 20 72 65 66 65 72 65 6e 63  o table referenc
78d0: 65 73 20 2a 2f 0a 20 20 69 66 28 20 28 6d 50 72  es */.  if( (mPr
78e0: 65 72 65 71 26 28 6d 50 72 65 72 65 71 2d 31 29  ereq&(mPrereq-1)
78f0: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
7900: 20 20 20 2f 2a 20 52 65 66 73 20 6d 6f 72 65 20     /* Refs more 
7910: 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 2a  than one table *
7920: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6d 50 72  /.  for(i=0; mPr
7930: 65 72 65 71 3e 31 3b 20 69 2b 2b 2c 20 6d 50 72  ereq>1; i++, mPr
7940: 65 72 65 71 3e 3e 3d 31 29 7b 7d 0a 20 20 69 43  ereq>>=1){}.  iC
7950: 75 72 20 3d 20 70 46 72 6f 6d 2d 3e 61 5b 69 5d  ur = pFrom->a[i]
7960: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 66 6f 72 28  .iCursor;.  for(
7970: 70 49 64 78 3d 70 46 72 6f 6d 2d 3e 61 5b 69 5d  pIdx=pFrom->a[i]
7980: 2e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  .pTab->pIndex; p
7990: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
79a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
79b0: 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d  pIdx->aColExpr==
79c0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
79d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
79e0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  x->nKeyCol; i++)
79f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
7a00: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 21 3d 28  ->aiColumn[i]!=(
7a10: 2d 32 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  -2) ) continue;.
7a20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7a30: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
7a40: 70 72 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  pr, pIdx->aColEx
7a50: 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  pr->a[i].pExpr, 
7a60: 69 43 75 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iCur)==0 ){.    
7a70: 20 20 20 20 2a 70 69 43 75 72 20 3d 20 69 43 75      *piCur = iCu
7a80: 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  r;.        *piCo
7a90: 6c 75 6d 6e 20 3d 20 2d 32 3b 0a 20 20 20 20 20  lumn = -2;.     
7aa0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7ab0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
7ac0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7ad0: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
7ae0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7af0: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
7b00: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
7b10: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
7b20: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
7b30: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
7b40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
7b50: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
7b60: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
7b70: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
7b80: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
7b90: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
7ba0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
7bb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
7bc0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
7bd0: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
7be0: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
7bf0: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
7c00: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
7c10: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
7c20: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  "..**.** If the 
7c30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
7c40: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
7c50: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
7c60: 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63  X and Y are.** c
7c70: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
7c80: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
7c90: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
7ca0: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
7cb0: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74  ual.** term of t
7cc0: 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20  he form "Y <op> 
7cd0: 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  X" is added to t
7ce0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
7cf0: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  and.** analyzed 
7d00: 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65  separately.  The
7d10: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69   original term i
7d20: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
7d30: 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64  RM_COPIED.** and
7d40: 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73   the new term is
7d50: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
7d60: 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75  M_DYNAMIC (becau
7d70: 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a  se it's pExpr.**
7d80: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
7d90: 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72  ed with the Wher
7da0: 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52  eClause) and TER
7db0: 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75  M_VIRTUAL (becau
7dc0: 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f  se it.** is a co
7dd0: 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61  mmuted copy of a
7de0: 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54   prior term.)  T
7df0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
7e00: 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a   has nChild=1.**
7e10: 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61   and the copy ha
7e20: 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20  s idxParent set 
7e30: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
7e40: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  the original ter
7e50: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
7e60: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20  d exprAnalyze(. 
7e70: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
7e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
7e90: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
7ea0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7eb0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
7ec0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
7ed0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
7ee0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
7ef0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
7f00: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
7f10: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  zed */.){.  Wher
7f20: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
7f30: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20  pWC->pWInfo; /* 
7f40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
7f50: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
7f60: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
7f70: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
7f80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72        /* The ter
7f90: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
7fa0: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
7fb0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
7fc0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
7fd0: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73   table index mas
7fe0: 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ks */.  Expr *pE
7ff0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
8000: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8010: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
8020: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
8030: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
8040: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
8050: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
8060: 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70   of the pExpr->p
8070: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
8080: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
80a0: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70  erequesites of p
80b0: 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Expr */.  Bitmas
80c0: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
80d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ;          /* Ex
80e0: 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73  tra dependencies
80f0: 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f   on LEFT JOIN */
8100: 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d  .  Expr *pStr1 =
8110: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8120: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
8130: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
8140: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
8150: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
8160: 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66         /* RHS of
8170: 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20   LIKE/GLOB ends 
8180: 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f  with wildcard */
8190: 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20  .  int noCase = 
81a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
81b0: 20 20 20 20 2f 2a 20 75 70 70 65 72 63 61 73 65      /* uppercase
81c0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
81d0: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 20 20 69 6e  owercase */.  in
81e0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8200: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
8210: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
8220: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
8230: 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
8240: 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e  arse;  /* Parsin
8250: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
8260: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8270: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
8280: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
8290: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
82a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
82b0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
82c0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
82d0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
82e0: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70  .  pMaskSet = &p
82f0: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b  WInfo->sMaskSet;
8300: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
8310: 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
8320: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
8330: 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _AS && pExpr->op
8340: 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  !=TK_COLLATE );.
8350: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 73    prereqLeft = s
8360: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
8370: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
8380: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
8390: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
83a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
83b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
83c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
83d0: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
83e0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
83f0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
8400: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
8410: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
8420: 70 72 53 65 6c 65 63 74 55 73 61 67 65 28 70 4d  prSelectUsage(pM
8430: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
8440: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
8450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72  else{.      pTer
8460: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
8470: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
8480: 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
8490: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  Set, pExpr->x.pL
84a0: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ist);.    }.  }e
84b0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
84c0: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65  SNULL ){.    pTe
84d0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
84e0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
84f0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
8500: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 57 68  ight = sqlite3Wh
8510: 65 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61  ereExprUsage(pMa
8520: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
8530: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
8540: 72 65 71 41 6c 6c 20 3d 20 73 71 6c 69 74 65 33  reqAll = sqlite3
8550: 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70  WhereExprUsage(p
8560: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b  MaskSet, pExpr);
8570: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
8580: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
8590: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
85a0: 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 73 71    Bitmask x = sq
85b0: 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
85c0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  k(pMaskSet, pExp
85d0: 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
85e0: 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41  le);.    prereqA
85f0: 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74  ll |= x;.    ext
8600: 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20  raRight = x-1;  
8610: 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  /* ON clause ter
8620: 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ms may not be us
8630: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
8640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8650: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65          ** on le
8660: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ft table of a LE
8670: 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74  FT JOIN.  Ticket
8680: 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20   #3015 */.  }.  
8690: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
86a0: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
86b0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
86c0: 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  r = -1;.  pTerm-
86d0: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
86e0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
86f0: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c  r = 0;.  if( all
8700: 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20  owedOp(op) ){.  
8710: 20 20 69 6e 74 20 69 43 75 72 2c 20 69 43 6f 6c    int iCur, iCol
8720: 75 6d 6e 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  umn;.    Expr *p
8730: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8740: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
8750: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8760: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
8770: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
8780: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52  ollate(pExpr->pR
8790: 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20 6f  ight);.    u16 o
87a0: 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d 3e  pMask = (pTerm->
87b0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72  prereqRight & pr
87c0: 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20 57  ereqLeft)==0 ? W
87d0: 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49 56  O_ALL : WO_EQUIV
87e0: 3b 0a 20 20 20 20 69 66 28 20 65 78 70 72 4d 69  ;.    if( exprMi
87f0: 67 68 74 42 65 49 6e 64 65 78 65 64 28 70 53 72  ghtBeIndexed(pSr
8800: 63 2c 20 70 72 65 72 65 71 4c 65 66 74 2c 20 70  c, prereqLeft, p
8810: 4c 65 66 74 2c 20 26 69 43 75 72 2c 20 26 69 43  Left, &iCur, &iC
8820: 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20  olumn) ){.      
8830: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
8840: 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  r = iCur;.      
8850: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
8860: 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  umn = iColumn;. 
8870: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
8880: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
8890: 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73  Mask(op) & opMas
88a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
88b0: 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 20 70 54 65   op==TK_IS ) pTe
88c0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
88d0: 45 52 4d 5f 49 53 3b 0a 20 20 20 20 69 66 28 20  ERM_IS;.    if( 
88e0: 70 52 69 67 68 74 20 0a 20 20 20 20 20 26 26 20  pRight .     && 
88f0: 65 78 70 72 4d 69 67 68 74 42 65 49 6e 64 65 78  exprMightBeIndex
8900: 65 64 28 70 53 72 63 2c 20 70 54 65 72 6d 2d 3e  ed(pSrc, pTerm->
8910: 70 72 65 72 65 71 52 69 67 68 74 2c 20 70 52 69  prereqRight, pRi
8920: 67 68 74 2c 20 26 69 43 75 72 2c 20 26 69 43 6f  ght, &iCur, &iCo
8930: 6c 75 6d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  lumn).    ){.   
8940: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
8950: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
8960: 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 20  pDup;.      u16 
8970: 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 20  eExtraOp = 0;   
8980: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 69       /* Extra bi
8990: 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f 70  ts for pNew->eOp
89a0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
89b0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
89c0: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
89d0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
89e0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
89f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8a00: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
8a10: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
8a20: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8a30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8a40: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
8a50: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
8a60: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
8a70: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
8a80: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
8a90: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
8aa0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
8ab0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
8ac0: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
8ad0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
8ae0: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
8af0: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
8b00: 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c    markTermAsChil
8b10: 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69  d(pWC, idxNew, i
8b20: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20  dxTerm);.       
8b30: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29   if( op==TK_IS )
8b40: 20 70 4e 65 77 2d 3e 77 74 46 6c 61 67 73 20 7c   pNew->wtFlags |
8b50: 3d 20 54 45 52 4d 5f 49 53 3b 0a 20 20 20 20 20  = TERM_IS;.     
8b60: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
8b70: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
8b80: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
8b90: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
8ba0: 45 44 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ED;..        if(
8bb0: 20 74 65 72 6d 49 73 45 71 75 69 76 61 6c 65 6e   termIsEquivalen
8bc0: 63 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  ce(pParse, pDup)
8bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
8be0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  erm->eOperator |
8bf0: 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  = WO_EQUIV;.    
8c00: 20 20 20 20 20 20 65 45 78 74 72 61 4f 70 20 3d        eExtraOp =
8c10: 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20   WO_EQUIV;.     
8c20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8c30: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
8c40: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
8c50: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
8c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
8c70: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
8c80: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4e 65  pDup);.      pNe
8c90: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
8ca0: 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  iCur;.      pNew
8cb0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
8cc0: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20   iColumn;.      
8cd0: 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65  testcase( (prere
8ce0: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
8cf0: 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66  ht) != prereqLef
8d00: 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
8d10: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
8d20: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
8d30: 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e  aRight;.      pN
8d40: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
8d50: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
8d60: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
8d70: 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b   = (operatorMask
8d80: 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78  (pDup->op) + eEx
8d90: 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  traOp) & opMask;
8da0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
8db0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8dc0: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
8dd0: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
8de0: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
8df0: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
8e00: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
8e10: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
8e20: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
8e30: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
8e40: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
8e50: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
8e60: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61    **.  **      a
8e70: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
8e80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
8e90: 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20  nverted into:.  
8ea0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20  **.  **      (a 
8eb0: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29  BETWEEN b AND c)
8ec0: 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20   AND (a>=b) AND 
8ed0: 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a  (a<=c).  **.  **
8ee0: 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72   The two new ter
8ef0: 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74  ms are added ont
8f00: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
8f10: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
8f20: 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65  ect..  ** The ne
8f30: 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e  w terms are "dyn
8f40: 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68  amic" and are ch
8f50: 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72  ildren of the or
8f60: 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20  iginal BETWEEN. 
8f70: 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20   ** term.  That 
8f80: 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
8f90: 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  e BETWEEN term i
8fa0: 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69  s coded, the chi
8fb0: 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73  ldren are.  ** s
8fc0: 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20  kipped.  Or, if 
8fd0: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
8fe0: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e   satisfied by an
8ff0: 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67   index, the orig
9000: 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45  inal.  ** BETWEE
9010: 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65  N term is skippe
9020: 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
9030: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
9040: 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d  _BETWEEN && pWC-
9050: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
9060: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
9070: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
9080: 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
9090: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
90a0: 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f   u8 ops[] = {TK_
90b0: 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20  GE, TK_LE};.    
90c0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
90d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
90e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20  pList->nExpr==2 
90f0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
9100: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
9110: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
9120: 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65  .      int idxNe
9130: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  w;.      pNewExp
9140: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
9150: 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c  (pParse, ops[i],
9160: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9180: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9190: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
91a0: 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
91d0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
91e0: 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20  pExpr, 0), 0);. 
91f0: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
9200: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
9210: 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
9220: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
9230: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
9240: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
9250: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
9260: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
9270: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
9280: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
9290: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
92a0: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
92b0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
92c0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
92d0: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
92e0: 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64  (pWC, idxNew, id
92f0: 78 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  xTerm);.    }.  
9300: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9310: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
9320: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
9330: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9340: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
9350: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
9360: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9370: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f  IT_SUBQUERY).  /
9380: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
9390: 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65   that is compose
93a0: 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  d of two or more
93b0: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
93c0: 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f  ted by.  ** an O
93d0: 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  R operator..  */
93e0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
93f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
9400: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43 2d      assert( pWC-
9410: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20  >op==TK_AND );. 
9420: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72     exprAnalyzeOr
9430: 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20  Term(pSrc, pWC, 
9440: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54  idxTerm);.    pT
9450: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
9460: 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64  xTerm];.  }.#end
9470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9480: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
9490: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
94a0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
94b0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
94c0: 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   Add constraints
94d0: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
94e0: 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61  earch space on a
94f0: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20   LIKE or GLOB.  
9500: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ** operator..  *
9510: 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61  *.  ** A like pa
9520: 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72  ttern of the for
9530: 6d 20 22 78 20 4c 49 4b 45 20 27 61 42 63 25 27  m "x LIKE 'aBc%'
9540: 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74  " is changed int
9550: 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  o constraints.  
9560: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
9570: 20 78 3e 3d 27 41 42 43 27 20 41 4e 44 20 78 3c   x>='ABC' AND x<
9580: 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45  'abd' AND x LIKE
9590: 20 27 61 42 63 25 27 0a 20 20 2a 2a 0a 20 20 2a   'aBc%'.  **.  *
95a0: 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72 61  * The last chara
95b0: 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65 66  cter of the pref
95c0: 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63 72  ix "abc" is incr
95d0: 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20  emented to form 
95e0: 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61  the.  ** termina
95f0: 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22  tion condition "
9600: 61 62 64 22 2e 20 20 49 66 20 63 61 73 65 20 69  abd".  If case i
9610: 73 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e  s not significan
9620: 74 20 28 74 68 65 20 64 65 66 61 75 6c 74 0a 20  t (the default. 
9630: 20 2a 2a 20 66 6f 72 20 4c 49 4b 45 29 20 74 68   ** for LIKE) th
9640: 65 6e 20 74 68 65 20 6c 6f 77 65 72 2d 62 6f 75  en the lower-bou
9650: 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c 20 75  nd is made all u
9660: 70 70 65 72 63 61 73 65 20 61 6e 64 20 74 68 65  ppercase and the
9670: 20 75 70 70 65 72 2d 0a 20 20 2a 2a 20 62 6f 75   upper-.  ** bou
9680: 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c 20 6c  nd is made all l
9690: 6f 77 65 72 63 61 73 65 20 73 6f 20 74 68 61 74  owercase so that
96a0: 20 74 68 65 20 62 6f 75 6e 64 73 20 61 6c 73 6f   the bounds also
96b0: 20 77 6f 72 6b 20 77 68 65 6e 20 63 6f 6d 70 61   work when compa
96c0: 72 69 6e 67 0a 20 20 2a 2a 20 42 4c 4f 42 73 2e  ring.  ** BLOBs.
96d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
96e0: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
96f0: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
9700: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
9710: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
9720: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
9730: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
9740: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20  t;       /* LHS 
9750: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
9760: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
9770: 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20  r *pStr2;       
9780: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31  /* Copy of pStr1
9790: 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47   - RHS of LIKE/G
97a0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
97b0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
97c0: 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pr1;.    Expr *p
97d0: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
97e0: 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69  t idxNew1;.    i
97f0: 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20  nt idxNew2;.    
9800: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
9810: 6c 53 65 71 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  lSeqName;     /*
9820: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   Name of collati
9830: 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  ng sequence */. 
9840: 20 20 20 63 6f 6e 73 74 20 75 31 36 20 77 74 46     const u16 wtF
9850: 6c 61 67 73 20 3d 20 54 45 52 4d 5f 4c 49 4b 45  lags = TERM_LIKE
9860: 4f 50 54 20 7c 20 54 45 52 4d 5f 56 49 52 54 55  OPT | TERM_VIRTU
9870: 41 4c 20 7c 20 54 45 52 4d 5f 44 59 4e 41 4d 49  AL | TERM_DYNAMI
9880: 43 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  C;..    pLeft = 
9890: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
98a0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
98b0: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
98c0: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
98d0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  , 0);..    /* Co
98e0: 6e 76 65 72 74 20 74 68 65 20 6c 6f 77 65 72 20  nvert the lower 
98f0: 62 6f 75 6e 64 20 74 6f 20 75 70 70 65 72 2d 63  bound to upper-c
9900: 61 73 65 20 61 6e 64 20 74 68 65 20 75 70 70 65  ase and the uppe
9910: 72 20 62 6f 75 6e 64 20 74 6f 0a 20 20 20 20 2a  r bound to.    *
9920: 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20 28 75 70  * lower-case (up
9930: 70 65 72 2d 63 61 73 65 20 69 73 20 6c 65 73 73  per-case is less
9940: 20 74 68 61 6e 20 6c 6f 77 65 72 2d 63 61 73 65   than lower-case
9950: 20 69 6e 20 41 53 43 49 49 29 20 73 6f 20 74 68   in ASCII) so th
9960: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 61  at.    ** the ra
9970: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
9980: 61 6c 73 6f 20 77 6f 72 6b 20 66 6f 72 20 42 4c  also work for BL
9990: 4f 42 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  OBs.    */.    i
99a0: 66 28 20 6e 6f 43 61 73 65 20 26 26 20 21 70 50  f( noCase && !pP
99b0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
99c0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
99d0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61  int i;.      cha
99e0: 72 20 63 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  r c;.      pTerm
99f0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
9a00: 4d 5f 4c 49 4b 45 3b 0a 20 20 20 20 20 20 66 6f  M_LIKE;.      fo
9a10: 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 53 74 72  r(i=0; (c = pStr
9a20: 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 29 21  1->u.zToken[i])!
9a30: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
9a40: 20 20 70 53 74 72 31 2d 3e 75 2e 7a 54 6f 6b 65    pStr1->u.zToke
9a50: 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  n[i] = sqlite3To
9a60: 75 70 70 65 72 28 63 29 3b 0a 20 20 20 20 20 20  upper(c);.      
9a70: 20 20 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65    pStr2->u.zToke
9a80: 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  n[i] = sqlite3To
9a90: 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20  lower(c);.      
9aa0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
9ab0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
9ac0: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
9ad0: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
9ae0: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
9af0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
9b00: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
9b10: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
9b20: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
9b30: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
9b40: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
9b50: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
9b60: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
9b70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
9b80: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
9b90: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
9ba0: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
9bb0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
9bc0: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
9bd0: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
9be0: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
9bf0: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
9c00: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
9c10: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
9c20: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
9c30: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
9c40: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
9c50: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
9c60: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
9c70: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
9c80: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
9c90: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
9ca0: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
9cb0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
9cc0: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
9cd0: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
9ce0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9cf0: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
9d00: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
9d10: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71  ;.        c = sq
9d20: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
9d30: 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r[c];.      }.  
9d40: 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b      *pC = c + 1;
9d50: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c  .    }.    zColl
9d60: 53 65 71 4e 61 6d 65 20 3d 20 6e 6f 43 61 73 65  SeqName = noCase
9d70: 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42   ? "NOCASE" : "B
9d80: 49 4e 41 52 59 22 3b 0a 20 20 20 20 70 4e 65 77  INARY";.    pNew
9d90: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45  Expr1 = sqlite3E
9da0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
9db0: 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
9dc0: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
9dd0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
9de0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
9df0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
9e00: 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
9e10: 70 4e 65 77 45 78 70 72 31 2c 7a 43 6f 6c 6c 53  pNewExpr1,zCollS
9e20: 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
9e30: 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20      pStr1, 0);. 
9e40: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
9e50: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
9e60: 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  1, pExpr);.    i
9e70: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
9e80: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
9e90: 70 4e 65 77 45 78 70 72 31 2c 20 77 74 46 6c 61  pNewExpr1, wtFla
9ea0: 67 73 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  gs);.    testcas
9eb0: 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
9ec0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
9ed0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
9ee0: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
9ef0: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
9f00: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
9f10: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
9f20: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
9f30: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
9f40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9f50: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
9f60: 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 70 4e  String(pParse,pN
9f70: 65 77 45 78 70 72 32 2c 7a 43 6f 6c 6c 53 65 71  ewExpr2,zCollSeq
9f80: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
9f90: 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20    pStr2, 0);.   
9fa0: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
9fb0: 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72 32 2c  kings(pNewExpr2,
9fc0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78   pExpr);.    idx
9fd0: 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75  New2 = whereClau
9fe0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
9ff0: 65 77 45 78 70 72 32 2c 20 77 74 46 6c 61 67 73  ewExpr2, wtFlags
a000: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a010: 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20   idxNew2==0 );. 
a020: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
a030: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
a040: 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  2);.    pTerm = 
a050: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
a060: 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  ;.    if( isComp
a070: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 6d 61  lete ){.      ma
a080: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
a090: 43 2c 20 69 64 78 4e 65 77 31 2c 20 69 64 78 54  C, idxNew1, idxT
a0a0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 6d 61 72 6b  erm);.      mark
a0b0: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c  TermAsChild(pWC,
a0c0: 20 69 64 78 4e 65 77 32 2c 20 69 64 78 54 65 72   idxNew2, idxTer
a0d0: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  m);.    }.  }.#e
a0e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a0f0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
a100: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
a110: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
a120: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
a130: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
a140: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
a150: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
a160: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
a170: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
a180: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
a190: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
a1a0: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
a1b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
a1c0: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
a1d0: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
a1e0: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
a1f0: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
a200: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
a210: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
a220: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
a230: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
a240: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
a250: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
a260: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
a270: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
a280: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
a290: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
a2a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
a2b0: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
a2c0: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
a2d0: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
a2e0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
a2f0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
a300: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
a310: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
a320: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
a330: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 73    prereqExpr = s
a340: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
a350: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
a360: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72  Right);.    prer
a370: 65 71 43 6f 6c 75 6d 6e 20 3d 20 73 71 6c 69 74  eqColumn = sqlit
a380: 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65  e3WhereExprUsage
a390: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
a3a0: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
a3b0: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
a3c0: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
a3d0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
a3e0: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
a3f0: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
a400: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43  (pParse, TK_MATC
a410: 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  H, .            
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72    0, sqlite3Expr
a440: 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20  Dup(db, pRight, 
a450: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
a460: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
a470: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
a480: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
a490: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
a4a0: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
a4b0: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
a4c0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
a4d0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
a4e0: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
a4f0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
a500: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20   prereqExpr;.   
a510: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
a520: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
a530: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
a540: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
a550: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
a560: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
a570: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
a580: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
a590: 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68      markTermAsCh
a5a0: 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c  ild(pWC, idxNew,
a5b0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20   idxTerm);.     
a5c0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
a5d0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
a5e0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
a5f0: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
a600: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
a610: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
a620: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
a630: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
a640: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
a650: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
a660: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a670: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
a680: 54 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c  T4.  /* When sql
a690: 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
a6a0: 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
a6b0: 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f  lable an operato
a6c0: 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f  r of the.  ** fo
a6d0: 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c  rm "x IS NOT NUL
a6e0: 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73  L" can sometimes
a6f0: 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d 6f   be evaluated mo
a700: 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a 20  re efficiently. 
a710: 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20   ** as "x>NULL" 
a720: 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20 49  if x is not an I
a730: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a740: 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75 63  EY.  So construc
a750: 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  t a.  ** virtual
a760: 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66 6f   term of that fo
a770: 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  rm..  **.  ** No
a780: 74 65 20 74 68 61 74 20 74 68 65 20 76 69 72 74  te that the virt
a790: 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62 65  ual term must be
a7a0: 20 74 61 67 67 65 64 20 77 69 74 68 20 54 45 52   tagged with TER
a7b0: 4d 5f 56 4e 55 4c 4c 2e 0a 20 20 2a 2f 0a 20 20  M_VNULL..  */.  
a7c0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a7d0: 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
a7e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
a7f0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
a800: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
a810: 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26 26  iColumn>=0.   &&
a820: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
a830: 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
a840: 53 74 61 74 33 34 29 0a 20 20 29 7b 0a 20 20 20  Stat34).  ){.   
a850: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
a860: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
a870: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
a880: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
a890: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
a8a0: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
a8b0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
a8c0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a8d0: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
a900: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a930: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
a940: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
a950: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
a960: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
a970: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
a980: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
a9b0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
a9c0: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
a9d0: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
a9e0: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
a9f0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
aa00: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
aa10: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
aa20: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
aa30: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
aa40: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
aa50: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
aa60: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
aa70: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
aa80: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
aa90: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
aaa0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
aab0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
aac0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
aad0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
aae0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
aaf0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
ab00: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
ab10: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
ab20: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
ab30: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
ab40: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
ab50: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
ab60: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
ab70: 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74  */..  /* Prevent
ab80: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
ab90: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
aba0: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20  from being used 
abb0: 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e  to drive.  ** an
abc0: 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65   index for table
abd0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
abe0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
abf0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
ac00: 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67  ight |= extraRig
ac10: 68 74 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ht;.}../********
ac20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac60: 2a 2a 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ***.** Routines 
ac70: 77 69 74 68 20 66 69 6c 65 20 73 63 6f 70 65 20  with file scope 
ac80: 61 62 6f 76 65 2e 20 20 49 6e 74 65 72 66 61 63  above.  Interfac
ac90: 65 20 74 6f 20 74 68 65 20 72 65 73 74 20 6f 66  e to the rest of
aca0: 20 74 68 65 20 77 68 65 72 65 2e 63 0a 2a 2a 20   the where.c.** 
acb0: 73 75 62 73 79 73 74 65 6d 20 66 6f 6c 6c 6f 77  subsystem follow
acc0: 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..*************
acd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ace0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
acf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ad00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
ad10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ad20: 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73  ine identifies s
ad30: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  ubexpressions in
ad40: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ad50: 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20  e where.** each 
ad60: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
ad70: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68   separated by th
ad80: 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f  e AND operator o
ad90: 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
ada0: 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69  operator specifi
adb0: 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72  ed in the op par
adc0: 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65  ameter.  The Whe
add0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
ade0: 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  re.** is filled 
adf0: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
ae00: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
ae10: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
ae20: 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61  *.**    WHERE  a
ae30: 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f  =='hello' AND co
ae40: 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20  alesce(b,11)<10 
ae50: 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20  AND (c+12!=d OR 
ae60: 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20  c==22).**       
ae70: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20      \________/  
ae80: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
ae90: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
aea0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
aeb0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30            slot[0
aec0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  ]            slo
aed0: 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[1]            
aee0: 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a     slot[2].**.**
aef0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   The original WH
af00: 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45  ERE clause in pE
af10: 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64  xpr is unaltered
af20: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
af30: 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d  ine.** does is m
af40: 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69  ake slot[] entri
af50: 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73  es point to subs
af60: 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20  tructure within 
af70: 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pExpr..**.** In 
af80: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
af90: 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65  tence and in the
afa0: 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b   diagram, "slot[
afb0: 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20  ]" refers to.** 
afc0: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e  the WhereClause.
afd0: 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20  a[] array.  The 
afe0: 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f  slot[] array gro
aff0: 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20  ws as needed to 
b000: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74  contain.** all t
b010: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
b020: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 76 6f 69  E clause..*/.voi
b030: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70  d sqlite3WhereSp
b040: 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  lit(WhereClause 
b050: 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pWC, Expr *pExp
b060: 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20 45 78 70  r, u8 op){.  Exp
b070: 72 20 2a 70 45 32 20 3d 20 73 71 6c 69 74 65 33  r *pE2 = sqlite3
b080: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
b090: 70 45 78 70 72 29 3b 0a 20 20 70 57 43 2d 3e 6f  pExpr);.  pWC->o
b0a0: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
b0b0: 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  2==0 ) return;. 
b0c0: 20 69 66 28 20 70 45 32 2d 3e 6f 70 21 3d 6f 70   if( pE2->op!=op
b0d0: 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
b0e0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
b0f0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Expr, 0);.  }els
b100: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  e{.    sqlite3Wh
b110: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
b120: 32 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  2->pLeft, op);. 
b130: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53     sqlite3WhereS
b140: 70 6c 69 74 28 70 57 43 2c 20 70 45 32 2d 3e 70  plit(pWC, pE2->p
b150: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
b160: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
b170: 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  ize a preallocat
b180: 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  ed WhereClause s
b190: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
b1a0: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c  d sqlite3WhereCl
b1b0: 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72  auseInit(.  Wher
b1c0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
b1d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
b1e0: 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e  eClause to be in
b1f0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
b200: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
b210: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
b220: 48 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20  HERE processing 
b230: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
b240: 70 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57  pWC->pWInfo = pW
b250: 49 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75  Info;.  pWC->pOu
b260: 74 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e  ter = 0;.  pWC->
b270: 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43  nTerm = 0;.  pWC
b280: 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  ->nSlot = ArrayS
b290: 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63  ize(pWC->aStatic
b2a0: 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57  );.  pWC->a = pW
b2b0: 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f  C->aStatic;.}../
b2c0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
b2d0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
b2e0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68  ructure.  The Wh
b2f0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
b300: 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73  ure.** itself is
b310: 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69   not freed.  Thi
b320: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
b330: 20 69 6e 76 65 72 73 65 20 6f 66 20 73 71 6c 69   inverse of sqli
b340: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e  te3WhereClauseIn
b350: 69 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  it()..*/.void sq
b360: 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
b370: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
b380: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
b390: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
b3a0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
b3b0: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
b3c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
b3d0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
b3e0: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
b3f0: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
b400: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
b410: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
b420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b430: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
b440: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
b450: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
b460: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
b470: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
b480: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
b490: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
b4a0: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
b4b0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
b4c0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
b4d0: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
b4e0: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
b4f0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
b500: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
b510: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
b520: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b530: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
b540: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  }.../*.** These 
b550: 72 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20 28 72  routines walk (r
b560: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
b570: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
b580: 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61  nd generate.** a
b590: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
b5a0: 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73  ing which tables
b5b0: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61   are used in tha
b5c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  t expression.** 
b5d0: 74 72 65 65 2e 0a 2a 2f 0a 42 69 74 6d 61 73 6b  tree..*/.Bitmask
b5e0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
b5f0: 72 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  rUsage(WhereMask
b600: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
b610: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
b620: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
b630: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b640: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
b650: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
b660: 20 20 6d 61 73 6b 20 3d 20 73 71 6c 69 74 65 33    mask = sqlite3
b670: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61  WhereGetMask(pMa
b680: 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65  skSet, p->iTable
b690: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  );.    return ma
b6a0: 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d  sk;.  }.  mask =
b6b0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
b6c0: 72 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  rUsage(pMaskSet,
b6d0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
b6e0: 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68  ask |= sqlite3Wh
b6f0: 65 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61  ereExprUsage(pMa
b700: 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29  skSet, p->pLeft)
b710: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
b720: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
b730: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
b740: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
b750: 63 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  ctUsage(pMaskSet
b760: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
b770: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61  .  }else{.    ma
b780: 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  sk |= sqlite3Whe
b790: 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
b7a0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70  pMaskSet, p->x.p
b7b0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  List);.  }.  ret
b7c0: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 42 69 74 6d  urn mask;.}.Bitm
b7d0: 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65  ask sqlite3Where
b7e0: 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 57 68  ExprListUsage(Wh
b7f0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
b800: 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a  kSet, ExprList *
b810: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
b820: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
b830: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
b840: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
b850: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
b860: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73   i++){.      mas
b870: 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  k |= sqlite3Wher
b880: 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b  eExprUsage(pMask
b890: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
b8a0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
b8b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
b8c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  ;.}.../*.** Call
b8d0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20   exprAnalyze on 
b8e0: 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57  all terms in a W
b8f0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a  HERE clause.  .*
b900: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
b910: 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
b920: 68 74 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ht add new virtu
b930: 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
b940: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
b950: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57  WHERE clause.  W
b960: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
b970: 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 6e   analyze these n
b980: 65 77 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 65  ew.** virtual te
b990: 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
b9a0: 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
b9b0: 6e 64 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  nd and work forw
b9c0: 61 72 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  ard.** so that t
b9d0: 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c  he added virtual
b9e0: 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72   terms are never
b9f0: 20 70 72 6f 63 65 73 73 65 64 2e 0a 2a 2f 0a 76   processed..*/.v
ba00: 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
ba10: 45 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53  ExprAnalyze(.  S
ba20: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
ba30: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
ba40: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
ba50: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
ba60: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
ba70: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
ba80: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
ba90: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
baa0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
bab0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
bac0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
bad0: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
bae0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72    }.}../*.** For
baf0: 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75   table-valued-fu
bb00: 6e 63 74 69 6f 6e 73 2c 20 74 72 61 6e 73 66 6f  nctions, transfo
bb10: 72 6d 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  rm the function 
bb20: 61 72 67 75 6d 65 6e 74 73 20 69 6e 74 6f 0a 2a  arguments into.*
bb30: 2a 20 6e 65 77 20 57 48 45 52 45 20 63 6c 61 75  * new WHERE clau
bb40: 73 65 20 74 65 72 6d 73 2e 20 20 0a 2a 2a 0a 2a  se terms.  .**.*
bb50: 2a 20 45 61 63 68 20 66 75 6e 63 74 69 6f 6e 20  * Each function 
bb60: 61 72 67 75 6d 65 6e 74 20 74 72 61 6e 73 6c 61  argument transla
bb70: 74 65 73 20 69 6e 74 6f 20 61 6e 20 65 71 75 61  tes into an equa
bb80: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
bb90: 61 67 61 69 6e 73 74 0a 2a 2a 20 61 20 48 49 44  against.** a HID
bba0: 44 45 4e 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  DEN column in th
bbb0: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  e table..*/.void
bbc0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 61 62   sqlite3WhereTab
bbd0: 46 75 6e 63 41 72 67 73 28 0a 20 20 50 61 72 73  FuncArgs(.  Pars
bbe0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bc00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
bc10: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
bc20: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
bc30: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  ,       /* The F
bc40: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
bc50: 74 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  to process */.  
bc60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 2f 2a 20 58 66 65 72 20 66 75 6e 63 74 69    /* Xfer functi
bc90: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
bca0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  here */.){.  Tab
bcb0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
bcc0: 6a 2c 20 6b 3b 0a 20 20 45 78 70 72 4c 69 73 74  j, k;.  ExprList
bcd0: 20 2a 70 41 72 67 73 3b 0a 20 20 45 78 70 72 20   *pArgs;.  Expr 
bce0: 2a 70 43 6f 6c 52 65 66 3b 0a 20 20 45 78 70 72  *pColRef;.  Expr
bcf0: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 66 28 20 70   *pTerm;.  if( p
bd00: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
bd10: 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  nc==0 ) return;.
bd20: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
bd30: 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  pTab;.  assert( 
bd40: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 70 41 72  pTab!=0 );.  pAr
bd50: 67 73 20 3d 20 70 49 74 65 6d 2d 3e 75 31 2e 70  gs = pItem->u1.p
bd60: 46 75 6e 63 41 72 67 3b 0a 20 20 61 73 73 65 72  FuncArg;.  asser
bd70: 74 28 20 70 41 72 67 73 21 3d 30 20 29 3b 0a 20  t( pArgs!=0 );. 
bd80: 20 66 6f 72 28 6a 3d 6b 3d 30 3b 20 6a 3c 70 41   for(j=k=0; j<pA
bd90: 72 67 73 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  rgs->nExpr; j++)
bda0: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 6b 3c 70  {.    while( k<p
bdb0: 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 28 70 54  Tab->nCol && (pT
bdc0: 61 62 2d 3e 61 43 6f 6c 5b 6b 5d 2e 63 6f 6c 46  ab->aCol[k].colF
bdd0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48  lags & COLFLAG_H
bde0: 49 44 44 45 4e 29 3d 3d 30 20 29 7b 20 6b 2b 2b  IDDEN)==0 ){ k++
bdf0: 3b 20 7d 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  ; }.    if( k>=p
be00: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
be10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
be20: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
be30: 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f  many arguments o
be40: 6e 20 25 73 28 29 20 2d 20 6d 61 78 20 25 64 22  n %s() - max %d"
be50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be60: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
be70: 61 6d 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 72  ame, j);.      r
be80: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
be90: 20 70 43 6f 6c 52 65 66 20 3d 20 73 71 6c 69 74   pColRef = sqlit
bea0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
beb0: 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c  TK_COLUMN, 0, 0,
bec0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
bed0: 6c 52 65 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  lRef==0 ) return
bee0: 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d 3e 69  ;.    pColRef->i
bef0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
bf00: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 6f 6c  Cursor;.    pCol
bf10: 52 65 66 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6b  Ref->iColumn = k
bf20: 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d  ++;.    pColRef-
bf30: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
bf40: 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
bf50: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bf60: 4b 5f 45 51 2c 20 70 43 6f 6c 52 65 66 2c 0a 20  K_EQ, pColRef,. 
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bf90: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
bfa0: 62 2c 20 70 41 72 67 73 2d 3e 61 5b 6a 5d 2e 70  b, pArgs->a[j].p
bfb0: 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20  Expr, 0), 0);.  
bfc0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
bfd0: 65 72 74 28 70 57 43 2c 20 70 54 65 72 6d 2c 20  ert(pWC, pTerm, 
bfe0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
bff0: 20 7d 0a 7d 0a                                    }.}.