SQLite

Hex Artifact Content
Login

Artifact d87df2c00ecc0c2ef4409562608d19cec259a6a03ca72b86fc999db9c07ce119:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 36 2d 30 38  /*.** 2015-06-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63  ** This module c
0180: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 74  ontains C code t
0190: 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 56 44  hat generates VD
01a0: 42 45 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20  BE code used to 
01b0: 70 72 6f 63 65 73 73 0a 2a 2a 20 74 68 65 20 57  process.** the W
01c0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 53  HERE clause of S
01d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
01e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 77  *.** This file w
01f0: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  as originally pa
0200: 72 74 20 6f 66 20 77 68 65 72 65 2e 63 20 62 75  rt of where.c bu
0210: 74 20 77 61 73 20 73 70 6c 69 74 20 6f 75 74 20  t was split out 
0220: 74 6f 20 69 6d 70 72 6f 76 65 0a 2a 2a 20 72 65  to improve.** re
0230: 61 64 61 62 69 6c 69 74 79 20 61 6e 64 20 65 64  adability and ed
0240: 69 74 61 62 69 6c 69 69 74 79 2e 20 20 54 68 69  itabiliity.  Thi
0250: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  s file contains 
0260: 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 73  utility routines
0270: 20 66 6f 72 0a 2a 2a 20 61 6e 61 6c 79 7a 69 6e   for.** analyzin
0280: 67 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 69  g Expr objects i
0290: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
02a0: 73 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  se..*/.#include 
02b0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
02c0: 6e 63 6c 75 64 65 20 22 77 68 65 72 65 49 6e 74  nclude "whereInt
02d0: 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  .h"../* Forward 
02e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  declarations */.
02f0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
0300: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
0310: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
0320: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  int);../*.** Dea
0330: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
0340: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
0350: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
0360: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
0370: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
0380: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
0390: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
03a0: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
03b0: 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61  3WhereClauseClea
03c0: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
03d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
03e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
03f0: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72  locate all memor
0400: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
0410: 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f  h a WhereAndInfo
0420: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
0430: 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64  ic void whereAnd
0440: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
0450: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64  e3 *db, WhereAnd
0460: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Info *p){.  sqli
0470: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c  te3WhereClauseCl
0480: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
0490: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
04a0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   p);.}../*.** Ad
04b0: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
04c0: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
04d0: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
04e0: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
04f0: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
0500: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
0510: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
0520: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
0530: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
0540: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
0550: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
0560: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
0570: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
0580: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
0590: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
05a0: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
05b0: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
05c0: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
05d0: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
05e0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
05f0: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
0600: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
0610: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
0620: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
0630: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
0640: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
0650: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
0660: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
0670: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
0680: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
0690: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
06a0: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
06b0: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
06c0: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
06d0: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
06e0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
06f0: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
0700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
0710: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
0720: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
0730: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
0740: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
0750: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
0760: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
0770: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
0780: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
0790: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
07a0: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
07b0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
07c0: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
07d0: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
07e0: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
07f0: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
0800: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
0810: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
0820: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
0830: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
0840: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
0850: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
0860: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
0870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0880: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
0890: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
08a0: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 31 36  WC, Expr *p, u16
08b0: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65   wtFlags){.  Whe
08c0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
08d0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74   int idx;.  test
08e0: 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20  case( wtFlags & 
08f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
0900: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
0910: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
0920: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
0930: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
0940: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
0950: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  pWC->pWInfo->pPa
0960: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
0970: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
0980: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
0990: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
09a0: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b  *pWC->nSlot*2 );
09b0: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d  .    if( pWC->a=
09c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
09d0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  wtFlags & TERM_D
09e0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
09f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0a00: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
0a10: 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61    }.      pWC->a
0a20: 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72   = pOld;.      r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
0a40: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
0a50: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
0a60: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
0a70: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
0a80: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
0a90: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
0aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c  e3DbFree(db, pOl
0ab0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
0ac0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74  C->nSlot = sqlit
0ad0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
0ae0: 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f  b, pWC->a)/sizeo
0af0: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20  f(pWC->a[0]);.  
0b00: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
0b10: 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e  ->a[idx = pWC->n
0b20: 54 65 72 6d 2b 2b 5d 3b 0a 20 20 69 66 28 20 70  Term++];.  if( p
0b30: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
0b40: 72 74 79 28 70 2c 20 45 50 5f 55 6e 6c 69 6b 65  rty(p, EP_Unlike
0b50: 6c 79 29 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ly) ){.    pTerm
0b60: 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 73 71  ->truthProb = sq
0b70: 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 69  lite3LogEst(p->i
0b80: 54 61 62 6c 65 29 20 2d 20 32 37 30 3b 0a 20 20  Table) - 270;.  
0b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
0ba0: 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 31 3b  ->truthProb = 1;
0bb0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 45  .  }.  pTerm->pE
0bc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
0bd0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b  rSkipCollate(p);
0be0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
0bf0: 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70  s = wtFlags;.  p
0c00: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
0c10: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
0c20: 74 20 3d 20 2d 31 3b 0a 20 20 6d 65 6d 73 65 74  t = -1;.  memset
0c30: 28 26 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  (&pTerm->eOperat
0c40: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  or, 0,.         
0c50: 73 69 7a 65 6f 66 28 57 68 65 72 65 54 65 72 6d  sizeof(WhereTerm
0c60: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65  ) - offsetof(Whe
0c70: 72 65 54 65 72 6d 2c 65 4f 70 65 72 61 74 6f 72  reTerm,eOperator
0c80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78  ));.  return idx
0c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0ca0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
0cb0: 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ven operator is 
0cc0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
0cd0: 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20  tors that is.** 
0ce0: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69  allowed for an i
0cf0: 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63  ndexable WHERE c
0d00: 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65  lause term.  The
0d10: 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f   allowed operato
0d20: 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22  rs are.** "=", "
0d30: 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22  <", ">", "<=", "
0d40: 3e 3d 22 2c 20 22 49 4e 22 2c 20 22 49 53 22 2c  >=", "IN", "IS",
0d50: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
0d60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
0d70: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
0d80: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
0d90: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
0da0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
0db0: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
0dc0: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
0dd0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
0de0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
0df0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
0e00: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
0e10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
0e20: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
0e30: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
0e40: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
0e50: 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  ULL || op==TK_IS
0e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  ;.}../*.** Commu
0e70: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
0e80: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
0e90: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
0ea0: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
0eb0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
0ec0: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
0ed0: 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20  * If left/right 
0ee0: 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73  precedence rules
0ef0: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20   come into play 
0f00: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
0f10: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e   the.** collatin
0f20: 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e  g sequence, then
0f30: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0f40: 72 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20  rs are adjusted 
0f50: 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
0f60: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
0f70: 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sequence does no
0f80: 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65  t change.  For e
0f90: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f  xample:.** "Y co
0fa0: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
0fb0: 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70  X" becomes "X op
0fc0: 20 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20   Y" because any 
0fd0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0fe0: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
0ff0: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
1000: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
1010: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
1020: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
1030: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
1040: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
1050: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
1060: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a  EP_Collate flag.
1070: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74  ** is not commut
1080: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1090: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50  id exprCommute(P
10a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
10b0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
10c0: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
10d0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
10e0: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
10f0: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
1100: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
1110: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1120: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ate);.  assert( 
1130: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d  allowedOp(pExpr-
1140: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f  >op) && pExpr->o
1150: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66  p!=TK_IN );.  if
1160: 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c  ( expRight==expL
1170: 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  eft ){.    /* Ei
1180: 74 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74  ther X and Y bot
1190: 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f  h have COLLATE o
11a0: 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68  perator or neith
11b0: 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28  er do */.    if(
11c0: 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20   expRight ){.   
11d0: 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64     /* Both X and
11e0: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20   Y have COLLATE 
11f0: 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65  operators.  Make
1200: 20 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79   sure X is alway
1210: 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20  s.      ** used 
1220: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
1230: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20  EP_Collate flag 
1240: 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20  from Y. */.     
1250: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
1260: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
1270: 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  late;.    }else 
1280: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1290: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
12b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74  ){.      /* Neit
12c0: 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65  her X nor Y have
12d0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
12e0: 72 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20  rs, but X has a 
12f0: 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20  non-default.    
1300: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73    ** collating s
1310: 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64  equence.  So add
1320: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
1330: 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63  marker on X to c
1340: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74  ause.      ** it
1350: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
1360: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  first. */.      
1370: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
1380: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
1390: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53  e;.    }.  }.  S
13a0: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
13b0: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
13c0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
13d0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
13e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
13f0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
1400: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
1410: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
1420: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
1430: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
1440: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
1450: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1460: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
1470: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
1480: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
1490: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
14a0: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
14b0: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
14c0: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
14d0: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
14e0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
14f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
1500: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
1510: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
1520: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
1530: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
1540: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
1550: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
1560: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
1570: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
1580: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
1590: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
15a0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
15b0: 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
15c0: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
15d0: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
15e0: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
15f0: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
1600: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
1610: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
1620: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
1630: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
1640: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
1650: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
1660: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
1670: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
1680: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
1690: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
16a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
16b0: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
16c0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
16d0: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
16e0: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
16f0: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
1700: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 61 73 73  ==WO_GE );.  ass
1710: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 20 7c  ert( op!=TK_IS |
1720: 7c 20 63 3d 3d 57 4f 5f 49 53 20 29 3b 0a 20 20  | c==WO_IS );.  
1730: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 0a 23 69  return c;.}...#i
1740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1750: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
1760: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  ION./*.** Check 
1770: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
1780: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
1790: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  s a LIKE or GLOB
17a0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a   operator that.*
17b0: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  * can be optimiz
17c0: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c  ed using inequal
17d0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
17e0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
17f0: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64   it is.** so and
1800: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
1810: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
1820: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  r the operator t
1830: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65  o be optimizible
1840: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62  , the RHS must b
1850: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69  e a string.** li
1860: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20  teral that does 
1870: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
1880: 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
1890: 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 63 6f  LHS must be a co
18a0: 6c 75 6d 6e 0a 2a 2a 20 74 68 61 74 20 6d 61 79  lumn.** that may
18b0: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 2c 20 61   only be NULL, a
18c0: 20 73 74 72 69 6e 67 2c 20 6f 72 20 61 20 42 4c   string, or a BL
18d0: 4f 42 2c 20 6e 65 76 65 72 20 61 20 6e 75 6d 62  OB, never a numb
18e0: 65 72 2e 20 28 54 68 69 73 20 6d 65 61 6e 73 0a  er. (This means.
18f0: 2a 2a 20 74 68 61 74 20 76 69 72 74 75 61 6c 20  ** that virtual 
1900: 74 61 62 6c 65 73 20 63 61 6e 6e 6f 74 20 70 61  tables cannot pa
1910: 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
1920: 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
1930: 6f 6e 2e 29 20 20 54 68 65 0a 2a 2a 20 63 6f 6c  on.)  The.** col
1940: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1950: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  for the column o
1960: 6e 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62  n the LHS must b
1970: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
1980: 72 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 6f  r.** the operato
1990: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
19a0: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20   isLikeOrGlob(. 
19b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
19d0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
19e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
19f0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1a00: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
1a10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78  pression */.  Ex
1a20: 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20  pr **ppPrefix,  
1a30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b  /* Pointer to TK
1a40: 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69  _STRING expressi
1a50: 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e 20  on with pattern 
1a60: 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20  prefix */.  int 
1a70: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a  *pisComplete, /*
1a80: 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c   True if the onl
1a90: 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20  y wildcard is % 
1aa0: 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  in the last char
1ab0: 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  acter */.  int *
1ac0: 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20  pnoCase      /* 
1ad0: 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73  True if uppercas
1ae0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
1af0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a  to lowercase */.
1b00: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  ){.  const u8 *z
1b10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b20: 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53  /* String on RHS
1b30: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
1b40: 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  r */.  Expr *pRi
1b50: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20  ght, *pLeft;    
1b60: 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c    /* Right and l
1b70: 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45  eft size of LIKE
1b80: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
1b90: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
1ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1bb0: 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f  t of operands to
1bc0: 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
1bd0: 6f 72 20 2a 2f 0a 20 20 75 38 20 63 3b 20 20 20  or */.  u8 c;   
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63     /* One charac
1c00: 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20  ter in z[] */.  
1c10: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
1c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c30: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64  mber of non-wild
1c40: 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72  card prefix char
1c50: 61 63 74 65 72 73 20 2a 2f 0a 20 20 75 38 20 77  acters */.  u8 w
1c60: 63 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[4];           
1c70: 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61         /* Wildca
1c80: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  rd characters */
1c90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1ca0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
1cb0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1cc0: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
1cd0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20  3_value *pVal = 
1ce0: 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  0;.  int op;    
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69  /* Opcode of pRi
1d10: 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ght */.  int rc;
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1d40: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  de to return */.
1d50: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
1d60: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62  sLikeFunction(db
1d70: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65  , pExpr, pnoCase
1d80: 2c 20 28 63 68 61 72 2a 29 77 63 29 20 29 7b 0a  , (char*)wc) ){.
1d90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1da0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1db0: 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e  EBCDIC.  if( *pn
1dc0: 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30  oCase ) return 0
1dd0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74  ;.#endif.  pList
1de0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1df0: 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69  t;.  pLeft = pLi
1e00: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
1e10: 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69  .  pRight = sqli
1e20: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1e30: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  te(pList->a[0].p
1e40: 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70 52  Expr);.  op = pR
1e50: 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  ight->op;.  if( 
1e60: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
1e70: 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
1e80: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
1e90: 47 29 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  G)==0 ){.    Vdb
1ea0: 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20  e *pReprepare = 
1eb0: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
1ec0: 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  re;.    int iCol
1ed0: 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75   = pRight->iColu
1ee0: 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  mn;.    pVal = s
1ef0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
1f00: 6e 64 56 61 6c 75 65 28 70 52 65 70 72 65 70 61  ndValue(pReprepa
1f10: 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45  re, iCol, SQLITE
1f20: 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20  _AFF_BLOB);.    
1f30: 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69  if( pVal && sqli
1f40: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
1f50: 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Val)==SQLITE_TEX
1f60: 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  T ){.      z = s
1f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1f80: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
1f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1fa0: 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
1fb0: 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20  >pVdbe, iCol);. 
1fc0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
1fd0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  t->op==TK_VARIAB
1fe0: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  LE || pRight->op
1ff0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
2000: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
2010: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
2020: 20 20 7a 20 3d 20 28 75 38 2a 29 70 52 69 67 68    z = (u8*)pRigh
2030: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d  t->u.zToken;.  }
2040: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 0a 20 20 20  .  if( z ){..   
2050: 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 62   /* If the RHS b
2060: 65 67 69 6e 73 20 77 69 74 68 20 61 20 64 69 67  egins with a dig
2070: 69 74 20 6f 72 20 61 20 6d 69 6e 75 73 20 73 69  it or a minus si
2080: 67 6e 2c 20 74 68 65 6e 20 74 68 65 20 4c 48 53  gn, then the LHS
2090: 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
20a0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75  an ordinary colu
20b0: 6d 6e 20 28 6e 6f 74 20 61 20 76 69 72 74 75 61  mn (not a virtua
20c0: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 29 20  l table column) 
20d0: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69  with TEXT affini
20e0: 74 79 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ty..    ** Other
20f0: 77 69 73 65 20 74 68 65 20 4c 48 53 20 6d 69 67  wise the LHS mig
2100: 68 74 20 62 65 20 6e 75 6d 65 72 69 63 20 61 6e  ht be numeric an
2110: 64 20 22 6c 68 73 20 3e 3d 20 72 68 73 22 20 77  d "lhs >= rhs" w
2120: 6f 75 6c 64 20 62 65 20 66 61 6c 73 65 0a 20 20  ould be false.  
2130: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
2140: 20 22 6c 68 73 20 4c 49 4b 45 20 72 68 73 22 20   "lhs LIKE rhs" 
2150: 69 73 20 74 72 75 65 2e 20 20 42 75 74 20 69 66  is true.  But if
2160: 20 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f   the RHS does no
2170: 74 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 77  t start.    ** w
2180: 69 74 68 20 61 20 64 69 67 69 74 20 6f 72 20 27  ith a digit or '
2190: 2d 27 2c 20 74 68 65 6e 20 22 6c 68 73 20 4c 49  -', then "lhs LI
21a0: 4b 45 20 72 68 73 22 20 77 69 6c 6c 20 61 6c 77  KE rhs" will alw
21b0: 61 79 73 20 62 65 20 66 61 6c 73 65 20 69 66 0a  ays be false if.
21c0: 20 20 20 20 2a 2a 20 74 68 65 20 4c 48 53 20 69      ** the LHS i
21d0: 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20 73 6f  s numeric and so
21e0: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
21f0: 6e 20 73 74 69 6c 6c 20 77 6f 72 6b 73 2e 0a 20  n still works.. 
2200: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
2210: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 5b 30  lite3Isdigit(z[0
2220: 5d 29 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2d 27 20  ]) || z[0]=='-' 
2230: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  ){.      if( pLe
2240: 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  ft->op!=TK_COLUM
2250: 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  N .       || sql
2260: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
2270: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
2280: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 20 20 20  AFF_TEXT .      
2290: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c   || IsVirtual(pL
22a0: 65 66 74 2d 3e 70 54 61 62 29 20 20 2f 2a 20 56  eft->pTab)  /* V
22b0: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6e 75  alue might be nu
22c0: 6d 65 72 69 63 20 2a 2f 0a 20 20 20 20 20 20 29  meric */.      )
22d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22e0: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
22f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2300: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2310: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  }..    /* Count 
2320: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72  the number of pr
2330: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
2340: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 72  prior to the fir
2350: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
2360: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
2370: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d  while( (c=z[cnt]
2380: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d  )!=0 && c!=wc[0]
2390: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20   && c!=wc[1] && 
23a0: 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20  c!=wc[2] ){.    
23b0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
23c0: 66 28 20 63 3d 3d 77 63 5b 33 5d 20 26 26 20 7a  f( c==wc[3] && z
23d0: 5b 63 6e 74 5d 21 3d 30 20 29 20 63 6e 74 2b 2b  [cnt]!=0 ) cnt++
23e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
23f0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
2400: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
2410: 79 20 69 66 20 28 31 29 20 74 68 65 20 70 61 74  y if (1) the pat
2420: 74 65 72 6e 20 64 6f 65 73 20 6e 6f 74 20 62 65  tern does not be
2430: 67 69 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  gin.    ** with 
2440: 61 20 77 69 6c 64 63 61 72 64 20 61 6e 64 20 69  a wildcard and i
2450: 66 20 28 32 29 20 74 68 65 20 6e 6f 6e 2d 77 69  f (2) the non-wi
2460: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 64 6f  ldcard prefix do
2470: 65 73 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 0a  es not end with.
2480: 20 20 20 20 2a 2a 20 61 6e 20 28 69 6c 6c 65 67      ** an (illeg
2490: 61 6c 20 30 78 66 66 29 20 63 68 61 72 61 63 74  al 0xff) charact
24a0: 65 72 2c 20 6f 72 20 28 33 29 20 74 68 65 20 70  er, or (3) the p
24b0: 61 74 74 65 72 6e 20 64 6f 65 73 20 6e 6f 74 20  attern does not 
24c0: 63 6f 6e 73 69 73 74 20 6f 66 0a 20 20 20 20 2a  consist of.    *
24d0: 2a 20 61 20 73 69 6e 67 6c 65 20 65 73 63 61 70  * a single escap
24e0: 65 20 63 68 61 72 61 63 74 65 72 2e 20 54 68 65  e character. The
24f0: 20 73 65 63 6f 6e 64 20 63 6f 6e 64 69 74 69 6f   second conditio
2500: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  n is necessary s
2510: 6f 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65  o.    ** that we
2520: 20 63 61 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74   can increment t
2530: 68 65 20 70 72 65 66 69 78 20 6b 65 79 20 74 6f  he prefix key to
2540: 20 66 69 6e 64 20 61 6e 20 75 70 70 65 72 20 62   find an upper b
2550: 6f 75 6e 64 20 66 6f 72 20 74 68 65 0a 20 20 20  ound for the.   
2560: 20 2a 2a 20 72 61 6e 67 65 20 73 65 61 72 63 68   ** range search
2570: 2e 20 54 68 65 20 74 68 69 72 64 20 69 73 20 62  . The third is b
2580: 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 65  ecause the calle
2590: 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
25a0: 68 65 20 70 61 74 74 65 72 6e 0a 20 20 20 20 2a  he pattern.    *
25b0: 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 74  * consists of at
25c0: 20 6c 65 61 73 74 20 6f 6e 65 20 63 68 61 72 61   least one chara
25d0: 63 74 65 72 20 61 66 74 65 72 20 61 6c 6c 20 65  cter after all e
25e0: 73 63 61 70 65 73 20 68 61 76 65 20 62 65 65 6e  scapes have been
25f0: 0a 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 2e  .    ** removed.
2600: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
2610: 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29  !=0 && 255!=(u8)
2620: 7a 5b 63 6e 74 2d 31 5d 20 26 26 20 28 63 6e 74  z[cnt-1] && (cnt
2630: 3e 31 20 7c 7c 20 7a 5b 30 5d 21 3d 77 63 5b 33  >1 || z[0]!=wc[3
2640: 5d 29 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  ]) ){.      Expr
2650: 20 2a 70 50 72 65 66 69 78 3b 0a 0a 20 20 20 20   *pPrefix;..    
2660: 20 20 2f 2a 20 41 20 22 63 6f 6d 70 6c 65 74 65    /* A "complete
2670: 22 20 6d 61 74 63 68 20 69 66 20 74 68 65 20 70  " match if the p
2680: 61 74 74 65 72 6e 20 65 6e 64 73 20 77 69 74 68  attern ends with
2690: 20 22 2a 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20   "*" or "%" */. 
26a0: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
26b0: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
26c0: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 0a 20 20  z[cnt+1]==0;..  
26d0: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 70      /* Get the p
26e0: 61 74 74 65 72 6e 20 70 72 65 66 69 78 2e 20 20  attern prefix.  
26f0: 52 65 6d 6f 76 65 20 61 6c 6c 20 65 73 63 61 70  Remove all escap
2700: 65 73 20 66 72 6f 6d 20 74 68 65 20 70 72 65 66  es from the pref
2710: 69 78 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 72  ix. */.      pPr
2720: 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78  efix = sqlite3Ex
2730: 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47  pr(db, TK_STRING
2740: 2c 20 28 63 68 61 72 2a 29 7a 29 3b 0a 20 20 20  , (char*)z);.   
2750: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29     if( pPrefix )
2760: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 46  {.        int iF
2770: 72 6f 6d 2c 20 69 54 6f 3b 0a 20 20 20 20 20 20  rom, iTo;.      
2780: 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 70    char *zNew = p
2790: 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e  Prefix->u.zToken
27a0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 5b 63  ;.        zNew[c
27b0: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nt] = 0;.       
27c0: 20 66 6f 72 28 69 46 72 6f 6d 3d 69 54 6f 3d 30   for(iFrom=iTo=0
27d0: 3b 20 69 46 72 6f 6d 3c 63 6e 74 3b 20 69 46 72  ; iFrom<cnt; iFr
27e0: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
27f0: 20 69 66 28 20 7a 4e 65 77 5b 69 46 72 6f 6d 5d   if( zNew[iFrom]
2800: 3d 3d 77 63 5b 33 5d 20 29 20 69 46 72 6f 6d 2b  ==wc[3] ) iFrom+
2810: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 65  +;.          zNe
2820: 77 5b 69 54 6f 2b 2b 5d 20 3d 20 7a 4e 65 77 5b  w[iTo++] = zNew[
2830: 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 20 20  iFrom];.        
2840: 7d 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 5b 69  }.        zNew[i
2850: 54 6f 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  To] = 0;.      }
2860: 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78  .      *ppPrefix
2870: 20 3d 20 70 50 72 65 66 69 78 3b 0a 0a 20 20 20   = pPrefix;..   
2880: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53     /* If the RHS
2890: 20 70 61 74 74 65 72 6e 20 69 73 20 61 20 62 6f   pattern is a bo
28a0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 6d  und parameter, m
28b0: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
28c0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 70   to.      ** rep
28d0: 72 65 70 61 72 65 20 74 68 65 20 73 74 61 74 65  repare the state
28e0: 6d 65 6e 74 20 77 68 65 6e 20 74 68 61 74 20 70  ment when that p
28f0: 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 62 6f  arameter is rebo
2900: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  und */.      if(
2910: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
2920: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
2930: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2940: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
2950: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
2960: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
2970: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
2980: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
2990: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
29a0: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
29b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
29c0: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
29d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
29e0: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
29f0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
2a00: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
2a20: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
2a30: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
2a40: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
2a50: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
2a60: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
2a70: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
2a80: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
2a90: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
2aa0: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
2ab0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
2ac0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2ad0: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
2ae0: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
2af0: 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64   around them, ad
2b00: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
2b10: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
2b20: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
2b30: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
2b40: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2b50: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2b60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2b70: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
2b80: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
2b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ba0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
2bb0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2bc0: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
2bd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2be0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2bf0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
2c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
2c20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2c30: 0a 20 20 72 63 20 3d 20 28 7a 21 3d 30 29 3b 0a  .  rc = (z!=0);.
2c40: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
2c50: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
2c60: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
2c70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
2c80: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
2c90: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
2ca0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2cb0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65  LTABLE./*.** Che
2cc0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2cd0: 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2ce0: 6e 20 69 73 20 61 20 66 6f 72 6d 20 74 68 61 74  n is a form that
2cf0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 73   needs to be pas
2d00: 73 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 78 42  sed.** to the xB
2d10: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
2d20: 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  of virtual table
2d30: 73 2e 20 20 46 6f 72 6d 73 20 6f 66 20 69 6e 74  s.  Forms of int
2d40: 65 72 65 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a  erest include:.*
2d50: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 45 78  *.**          Ex
2d60: 70 72 65 73 73 69 6f 6e 20 20 20 20 20 20 20 20  pression        
2d70: 20 20 20 20 20 20 20 20 20 20 20 56 69 72 74 75             Virtu
2d80: 61 6c 20 54 61 62 6c 65 20 4f 70 65 72 61 74 6f  al Table Operato
2d90: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d  r.**          --
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2db0: 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d 2d 2d 2d 2d  -----      -----
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
2de0: 20 20 20 20 20 31 2e 20 20 63 6f 6c 75 6d 6e 20       1.  column 
2df0: 4d 41 54 43 48 20 65 78 70 72 20 20 20 20 20 20  MATCH expr      
2e00: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 44        SQLITE_IND
2e10: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
2e20: 54 43 48 0a 2a 2a 20 20 20 20 20 20 32 2e 20 20  TCH.**      2.  
2e30: 63 6f 6c 75 6d 6e 20 47 4c 4f 42 20 65 78 70 72  column GLOB expr
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2e50: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
2e60: 41 49 4e 54 5f 47 4c 4f 42 0a 2a 2a 20 20 20 20  AINT_GLOB.**    
2e70: 20 20 33 2e 20 20 63 6f 6c 75 6d 6e 20 4c 49 4b    3.  column LIK
2e80: 45 20 65 78 70 72 20 20 20 20 20 20 20 20 20 20  E expr          
2e90: 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f     SQLITE_INDEX_
2ea0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 49 4b 45 0a  CONSTRAINT_LIKE.
2eb0: 2a 2a 20 20 20 20 20 20 34 2e 20 20 63 6f 6c 75  **      4.  colu
2ec0: 6d 6e 20 52 45 47 45 58 50 20 65 78 70 72 20 20  mn REGEXP expr  
2ed0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2ee0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
2ef0: 5f 52 45 47 45 58 50 0a 2a 2a 20 20 20 20 20 20  _REGEXP.**      
2f00: 35 2e 20 20 63 6f 6c 75 6d 6e 20 21 3d 20 65 78  5.  column != ex
2f10: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pr              
2f20: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
2f30: 4e 53 54 52 41 49 4e 54 5f 4e 45 0a 2a 2a 20 20  NSTRAINT_NE.**  
2f40: 20 20 20 20 36 2e 20 20 65 78 70 72 20 21 3d 20      6.  expr != 
2f50: 63 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 20 20  column          
2f60: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45       SQLITE_INDE
2f70: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 0a  X_CONSTRAINT_NE.
2f80: 2a 2a 20 20 20 20 20 20 37 2e 20 20 63 6f 6c 75  **      7.  colu
2f90: 6d 6e 20 49 53 20 4e 4f 54 20 65 78 70 72 20 20  mn IS NOT expr  
2fa0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2fb0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
2fc0: 5f 49 53 4e 4f 54 0a 2a 2a 20 20 20 20 20 20 38  _ISNOT.**      8
2fd0: 2e 20 20 65 78 70 72 20 49 53 20 4e 4f 54 20 63  .  expr IS NOT c
2fe0: 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 20 20 20  olumn           
2ff0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
3000: 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54 0a 2a 2a  STRAINT_ISNOT.**
3010: 20 20 20 20 20 20 39 2e 20 20 63 6f 6c 75 6d 6e        9.  column
3020: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
3030: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
3040: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
3050: 53 4e 4f 54 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 49  SNOTNULL.**.** I
3060: 6e 20 65 76 65 72 79 20 63 61 73 65 2c 20 22 63  n every case, "c
3070: 6f 6c 75 6d 6e 22 20 6d 75 73 74 20 62 65 20 61  olumn" must be a
3080: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69 72   column of a vir
3090: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 49 66 20  tual table.  If 
30a0: 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 6d 61  there.** is a ma
30b0: 74 63 68 2c 20 73 65 74 20 2a 70 70 4c 65 66 74  tch, set *ppLeft
30c0: 20 74 6f 20 74 68 65 20 22 63 6f 6c 75 6d 6e 22   to the "column"
30d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73 65 74   expression, set
30e0: 20 2a 70 70 52 69 67 68 74 20 74 6f 20 74 68 65   *ppRight to the
30f0: 20 0a 2a 2a 20 22 65 78 70 72 22 20 65 78 70 72   .** "expr" expr
3100: 65 73 73 69 6f 6e 20 28 65 76 65 6e 20 74 68 6f  ession (even tho
3110: 75 67 68 20 69 6e 20 66 6f 72 6d 73 20 28 36 29  ugh in forms (6)
3120: 20 61 6e 64 20 28 38 29 20 74 68 65 20 63 6f 6c   and (8) the col
3130: 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 0a 2a 2a  umn is on the.**
3140: 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 65   right and the e
3150: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 6e 20  xpression is on 
3160: 74 68 65 20 6c 65 66 74 29 2e 20 20 41 6c 73 6f  the left).  Also
3170: 20 73 65 74 20 2a 70 65 4f 70 32 20 74 6f 20 74   set *peOp2 to t
3180: 68 65 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  he.** appropriat
3190: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
31a0: 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 72  operator.  The r
31b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
31c0: 20 6f 72 20 32 20 69 66 20 74 68 65 72 65 0a 2a   or 2 if there.*
31d0: 2a 20 69 73 20 61 20 6d 61 74 63 68 2e 20 20 54  * is a match.  T
31e0: 68 65 20 75 73 75 61 6c 20 72 65 74 75 72 6e 20  he usual return 
31f0: 69 73 20 31 2c 20 62 75 74 20 69 66 20 74 68 65  is 1, but if the
3200: 20 52 48 53 20 69 73 20 61 6c 73 6f 20 61 20 63   RHS is also a c
3210: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 76 69 72 74  olumn.** of virt
3220: 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 66 6f 72  ual table in for
3230: 6d 73 20 28 35 29 20 6f 72 20 28 37 29 20 74 68  ms (5) or (7) th
3240: 65 6e 20 72 65 74 75 72 6e 20 32 2e 0a 2a 2a 0a  en return 2..**.
3250: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
3260: 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 6e 6f 6e  sion matches non
3270: 65 20 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e  e of the pattern
3280: 73 20 61 62 6f 76 65 2c 20 72 65 74 75 72 6e 20  s above, return 
3290: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
32a0: 20 69 73 41 75 78 69 6c 69 61 72 79 56 74 61 62   isAuxiliaryVtab
32b0: 4f 70 65 72 61 74 6f 72 28 0a 20 20 73 71 6c 69  Operator(.  sqli
32c0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
32f0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
3320: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
3330: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3340: 70 65 4f 70 32 2c 20 20 20 20 20 20 20 20 20 20  peOp2,          
3350: 20 2f 2a 20 4f 55 54 3a 20 30 20 66 6f 72 20 4d   /* OUT: 0 for M
3360: 41 54 43 48 2c 20 6f 72 20 65 6c 73 65 20 61 6e  ATCH, or else an
3370: 20 6f 70 32 20 76 61 6c 75 65 20 2a 2f 0a 20 20   op2 value */.  
3380: 45 78 70 72 20 2a 2a 70 70 4c 65 66 74 2c 20 20  Expr **ppLeft,  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 65 78 70 72 65 73  /* Column expres
33b0: 73 69 6f 6e 20 74 6f 20 6c 65 66 74 20 6f 66 20  sion to left of 
33c0: 4d 41 54 43 48 2f 6f 70 32 20 2a 2f 0a 20 20 45  MATCH/op2 */.  E
33d0: 78 70 72 20 2a 2a 70 70 52 69 67 68 74 20 20 20  xpr **ppRight   
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33f0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
3400: 6c 65 66 74 20 6f 66 20 4d 41 54 43 48 2f 6f 70  left of MATCH/op
3410: 32 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  2 */.){.  if( pE
3420: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
3430: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 74 61 74  TION ){.    stat
3440: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
3450: 4f 70 32 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  Op2 {.      cons
3460: 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20  t char *zOp;.   
3470: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
3480: 20 65 4f 70 32 3b 0a 20 20 20 20 7d 20 61 4f 70   eOp2;.    } aOp
3490: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
34a0: 6d 61 74 63 68 22 2c 20 20 53 51 4c 49 54 45 5f  match",  SQLITE_
34b0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
34c0: 5f 4d 41 54 43 48 20 7d 2c 0a 20 20 20 20 20 20  _MATCH },.      
34d0: 7b 20 22 67 6c 6f 62 22 2c 20 20 20 53 51 4c 49  { "glob",   SQLI
34e0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
34f0: 49 4e 54 5f 47 4c 4f 42 20 7d 2c 0a 20 20 20 20  INT_GLOB },.    
3500: 20 20 7b 20 22 6c 69 6b 65 22 2c 20 20 20 53 51    { "like",   SQ
3510: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
3520: 52 41 49 4e 54 5f 4c 49 4b 45 20 7d 2c 0a 20 20  RAINT_LIKE },.  
3530: 20 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20      { "regexp", 
3540: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
3550: 53 54 52 41 49 4e 54 5f 52 45 47 45 58 50 20 7d  STRAINT_REGEXP }
3560: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 45 78 70 72  .    };.    Expr
3570: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  List *pList;.   
3580: 20 45 78 70 72 20 2a 70 43 6f 6c 3b 20 20 20 20   Expr *pCol;    
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 72 65 66 65 72   /* Column refer
35b0: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ence */.    int 
35c0: 69 3b 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  i;..    pList = 
35d0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
35e0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
35f0: 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
3600: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=2 ){.      ret
3610: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
3620: 20 20 2f 2a 20 42 75 69 6c 74 2d 69 6e 20 6f 70    /* Built-in op
3630: 65 72 61 74 6f 72 73 20 4d 41 54 43 48 2c 20 47  erators MATCH, G
3640: 4c 4f 42 2c 20 4c 49 4b 45 2c 20 61 6e 64 20 52  LOB, LIKE, and R
3650: 45 47 45 58 50 20 61 74 74 61 63 68 20 74 6f 20  EGEXP attach to 
3660: 61 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  a.    ** virtual
3670: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 69 72 20   table on their 
3680: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
3690: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
36a0: 6d 65 20 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  me as.    ** the
36b0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
36c0: 6f 70 65 72 61 6e 64 20 69 6e 20 74 68 65 69 72  operand in their
36d0: 20 69 6e 2d 66 69 78 20 66 6f 72 6d 2e 0a 20 20   in-fix form..  
36e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
36f0: 20 20 76 74 61 62 5f 63 6f 6c 75 6d 6e 20 4d 41    vtab_column MA
3700: 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  TCH expression. 
3710: 20 20 20 2a 2a 20 20 20 20 20 20 20 4d 41 54 43     **       MATC
3720: 48 28 65 78 70 72 65 73 73 69 6f 6e 2c 76 74 61  H(expression,vta
3730: 62 5f 63 6f 6c 75 6d 6e 29 0a 20 20 20 20 2a 2f  b_column).    */
3740: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 70 4c 69 73  .    pCol = pLis
3750: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
3760: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 6f 70 3d     if( pCol->op=
3770: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73  =TK_COLUMN && Is
3780: 56 69 72 74 75 61 6c 28 70 43 6f 6c 2d 3e 70 54  Virtual(pCol->pT
3790: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ab) ){.      for
37a0: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
37b0: 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  e(aOp); i++){.  
37c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
37d0: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
37e0: 75 2e 7a 54 6f 6b 65 6e 2c 20 61 4f 70 5b 69 5d  u.zToken, aOp[i]
37f0: 2e 7a 4f 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20  .zOp)==0 ){.    
3800: 20 20 20 20 20 20 2a 70 65 4f 70 32 20 3d 20 61        *peOp2 = a
3810: 4f 70 5b 69 5d 2e 65 4f 70 32 3b 0a 20 20 20 20  Op[i].eOp2;.    
3820: 20 20 20 20 20 20 2a 70 70 52 69 67 68 74 20 3d        *ppRight =
3830: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
3840: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  pr;.          *p
3850: 70 4c 65 66 74 20 3d 20 70 43 6f 6c 3b 0a 20 20  pLeft = pCol;.  
3860: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3870: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3880: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
3890: 2a 20 57 65 20 63 61 6e 20 61 6c 73 6f 20 6d 61  * We can also ma
38a0: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
38b0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
38c0: 6f 76 65 72 6c 6f 61 64 65 64 0a 20 20 20 20 2a  overloaded.    *
38d0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 72  * functions wher
38e0: 65 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20  e xFindFunction 
38f0: 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20  returns a value 
3900: 6f 66 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  of at least.    
3910: 2a 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  ** SQLITE_INDEX_
3920: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
3930: 49 4f 4e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ION..    **.    
3940: 2a 2a 20 20 20 20 20 20 4f 56 45 52 4c 4f 41 44  **      OVERLOAD
3950: 45 44 28 76 74 61 62 5f 63 6f 6c 75 6d 6e 2c 65  ED(vtab_column,e
3960: 78 70 72 65 73 73 69 6f 6e 29 0a 20 20 20 20 2a  xpression).    *
3970: 2a 0a 20 20 20 20 2a 2a 20 48 69 73 74 6f 72 69  *.    ** Histori
3980: 63 61 6c 6c 79 2c 20 78 46 69 6e 64 46 75 6e 63  cally, xFindFunc
3990: 74 69 6f 6e 20 65 78 70 65 63 74 65 64 20 74 6f  tion expected to
39a0: 20 73 65 65 20 6c 6f 77 65 72 2d 63 61 73 65 20   see lower-case 
39b0: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  function.    ** 
39c0: 6e 61 6d 65 73 2e 20 20 42 75 74 20 66 6f 72 20  names.  But for 
39d0: 74 68 69 73 20 75 73 65 20 63 61 73 65 2c 20 78  this use case, x
39e0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 69 73 20  FindFunction is 
39f0: 65 78 70 65 63 74 65 64 20 74 6f 20 64 65 61 6c  expected to deal
3a00: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 66 75 6e  .    ** with fun
3a10: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 69 6e 20 61  ction names in a
3a20: 6e 20 61 72 62 69 74 72 61 72 79 20 63 61 73 65  n arbitrary case
3a30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 6f  ..    */.    pCo
3a40: 6c 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  l = pList->a[0].
3a50: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
3a60: 43 6f 6c 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  Col->op==TK_COLU
3a70: 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  MN && IsVirtual(
3a80: 70 43 6f 6c 2d 3e 70 54 61 62 29 20 29 7b 0a 20  pCol->pTab) ){. 
3a90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
3aa0: 62 20 2a 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b *pVtab;.      
3ab0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
3ac0: 70 4d 6f 64 3b 0a 20 20 20 20 20 20 76 6f 69 64  pMod;.      void
3ad0: 20 28 2a 78 4e 6f 74 55 73 65 64 29 28 73 71 6c   (*xNotUsed)(sql
3ae0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
3af0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
3b00: 2a 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  *);.      void *
3b10: 70 4e 6f 74 55 73 65 64 3b 0a 20 20 20 20 20 20  pNotUsed;.      
3b20: 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
3b30: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 43 6f  etVTable(db, pCo
3b40: 6c 2d 3e 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  l->pTab)->pVtab;
3b50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3b60: 56 74 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  Vtab!=0 );.     
3b70: 20 61 73 73 65 72 74 28 20 70 56 74 61 62 2d 3e   assert( pVtab->
3b80: 70 4d 6f 64 75 6c 65 21 3d 30 20 29 3b 0a 20 20  pModule!=0 );.  
3b90: 20 20 20 20 70 4d 6f 64 20 3d 20 28 73 71 6c 69      pMod = (sqli
3ba0: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74  te3_module *)pVt
3bb0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
3bc0: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 46 69     if( pMod->xFi
3bd0: 6e 64 46 75 6e 63 74 69 6f 6e 21 3d 30 20 29 7b  ndFunction!=0 ){
3be0: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 70 4d 6f  .        i = pMo
3bf0: 64 2d 3e 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  d->xFindFunction
3c00: 28 70 56 74 61 62 2c 32 2c 20 70 45 78 70 72 2d  (pVtab,2, pExpr-
3c10: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 78 4e 6f 74  >u.zToken, &xNot
3c20: 55 73 65 64 2c 20 26 70 4e 6f 74 55 73 65 64 29  Used, &pNotUsed)
3c30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  ;.        if( i>
3c40: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
3c50: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
3c60: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  N ){.          *
3c70: 70 65 4f 70 32 20 3d 20 69 3b 0a 20 20 20 20 20  peOp2 = i;.     
3c80: 20 20 20 20 20 2a 70 70 52 69 67 68 74 20 3d 20       *ppRight = 
3c90: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
3ca0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  r;.          *pp
3cb0: 4c 65 66 74 20 3d 20 70 43 6f 6c 3b 0a 20 20 20  Left = pCol;.   
3cc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
3cd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3ce0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
3cf0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
3d00: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
3d10: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 7c 7c 20  op==TK_ISNOT || 
3d20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
3d30: 54 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74  TNULL ){.    int
3d40: 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 45 78   res = 0;.    Ex
3d50: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
3d60: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78  r->pLeft;.    Ex
3d70: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
3d80: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
3d90: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
3da0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
3db0: 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61  rtual(pLeft->pTa
3dc0: 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73 2b  b) ){.      res+
3dd0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
3de0: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
3df0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
3e00: 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 52   && IsVirtual(pR
3e10: 69 67 68 74 2d 3e 70 54 61 62 29 20 29 7b 0a 20  ight->pTab) ){. 
3e20: 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 20 20       res++;.    
3e30: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 20 70 4c    SWAP(Expr*, pL
3e40: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
3e50: 20 20 7d 0a 20 20 20 20 2a 70 70 4c 65 66 74 20    }.    *ppLeft 
3e60: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 2a 70 70  = pLeft;.    *pp
3e70: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
3e80: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
3e90: 70 3d 3d 54 4b 5f 4e 45 20 29 20 2a 70 65 4f 70  p==TK_NE ) *peOp
3ea0: 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  2 = SQLITE_INDEX
3eb0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 3b 0a  _CONSTRAINT_NE;.
3ec0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
3ed0: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 20 2a 70  p==TK_ISNOT ) *p
3ee0: 65 4f 70 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e  eOp2 = SQLITE_IN
3ef0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49  DEX_CONSTRAINT_I
3f00: 53 4e 4f 54 3b 0a 20 20 20 20 69 66 28 20 70 45  SNOT;.    if( pE
3f10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  xpr->op==TK_NOTN
3f20: 55 4c 4c 20 29 20 2a 70 65 4f 70 32 20 3d 20 53  ULL ) *peOp2 = S
3f30: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
3f40: 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55 4c 4c  TRAINT_ISNOTNULL
3f50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
3f60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
3f70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3f80: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
3f90: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
3fa0: 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78   If the pBase ex
3fb0: 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
3fc0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
3fd0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
3fe0: 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  .** a join, then
3ff0: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70   transfer the ap
4000: 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e  propriate markin
4010: 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76  gs over to deriv
4020: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
4030: 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d  id transferJoinM
4040: 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44  arkings(Expr *pD
4050: 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42  erived, Expr *pB
4060: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72  ase){.  if( pDer
4070: 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72  ived ){.    pDer
4080: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
4090: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
40a0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70  _FromJoin;.    p
40b0: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
40c0: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
40d0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
40e0: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
40f0: 4d 61 72 6b 20 74 65 72 6d 20 69 43 68 69 6c 64  Mark term iChild
4100: 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69 6c   as being a chil
4110: 64 20 6f 66 20 74 65 72 6d 20 69 50 61 72 65 6e  d of term iParen
4120: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
4130: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
4140: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
4150: 43 2c 20 69 6e 74 20 69 43 68 69 6c 64 2c 20 69  C, int iChild, i
4160: 6e 74 20 69 50 61 72 65 6e 74 29 7b 0a 20 20 70  nt iParent){.  p
4170: 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69 50  WC->a[iChild].iP
4180: 61 72 65 6e 74 20 3d 20 69 50 61 72 65 6e 74 3b  arent = iParent;
4190: 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64  .  pWC->a[iChild
41a0: 5d 2e 74 72 75 74 68 50 72 6f 62 20 3d 20 70 57  ].truthProb = pW
41b0: 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74 72  C->a[iParent].tr
41c0: 75 74 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d 3e  uthProb;.  pWC->
41d0: 61 5b 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69 6c  a[iParent].nChil
41e0: 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  d++;.}../*.** Re
41f0: 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 41 4e  turn the N-th AN
4200: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74  D-connected subt
4210: 65 72 6d 20 6f 66 20 70 54 65 72 6d 2e 20 20 4f  erm of pTerm.  O
4220: 72 20 69 66 20 70 54 65 72 6d 20 69 73 20 6e 6f  r if pTerm is no
4230: 74 0a 2a 2a 20 61 20 63 6f 6e 6a 75 6e 63 74 69  t.** a conjuncti
4240: 6f 6e 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  on, then return 
4250: 6a 75 73 74 20 70 54 65 72 6d 20 77 68 65 6e 20  just pTerm when 
4260: 4e 3d 3d 30 2e 20 20 49 66 20 4e 20 69 73 20 65  N==0.  If N is e
4270: 78 63 65 65 64 73 0a 2a 2a 20 74 68 65 20 6e 75  xceeds.** the nu
4280: 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
4290: 65 20 73 75 62 74 65 72 6d 73 2c 20 72 65 74 75  e subterms, retu
42a0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
42b0: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
42c0: 65 72 65 4e 74 68 53 75 62 74 65 72 6d 28 57 68  ereNthSubterm(Wh
42d0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
42e0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 54  int N){.  if( pT
42f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
4300: 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 72 65  WO_AND ){.    re
4310: 74 75 72 6e 20 4e 3d 3d 30 20 3f 20 70 54 65 72  turn N==0 ? pTer
4320: 6d 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  m : 0;.  }.  if(
4330: 20 4e 3c 70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   N<pTerm->u.pAnd
4340: 49 6e 66 6f 2d 3e 77 63 2e 6e 54 65 72 6d 20 29  Info->wc.nTerm )
4350: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 54  {.    return &pT
4360: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
4370: 3e 77 63 2e 61 5b 4e 5d 3b 0a 20 20 7d 0a 20 20  >wc.a[N];.  }.  
4380: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4390: 2a 2a 20 53 75 62 74 65 72 6d 73 20 70 4f 6e 65  ** Subterms pOne
43a0: 20 61 6e 64 20 70 54 77 6f 20 61 72 65 20 63 6f   and pTwo are co
43b0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 57  ntained within W
43c0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e  HERE clause pWC.
43d0: 20 20 54 68 65 0a 2a 2a 20 74 77 6f 20 73 75 62    The.** two sub
43e0: 74 65 72 6d 73 20 61 72 65 20 69 6e 20 64 69 73  terms are in dis
43f0: 6a 75 6e 63 74 69 6f 6e 20 2d 20 74 68 65 79 20  junction - they 
4400: 61 72 65 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  are OR-ed togeth
4410: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
4420: 73 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65  se two terms are
4430: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 72   both of the for
4440: 6d 3a 20 20 22 41 20 6f 70 20 42 22 20 77 69 74  m:  "A op B" wit
4450: 68 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 41 20  h the same.** A 
4460: 61 6e 64 20 42 20 76 61 6c 75 65 73 20 62 75 74  and B values but
4470: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
4480: 74 6f 72 73 20 61 6e 64 20 69 66 20 74 68 65 20  tors and if the 
4490: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
44a0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 28 69 66 20   compatible (if 
44b0: 6f 6e 65 20 69 73 20 3d 20 61 6e 64 20 74 68 65  one is = and the
44c0: 20 6f 74 68 65 72 20 69 73 20 3c 2c 20 66 6f 72   other is <, for
44d0: 20 65 78 61 6d 70 6c 65 29 20 74 68 65 6e 0a 2a   example) then.*
44e0: 2a 20 61 64 64 20 61 20 6e 65 77 20 76 69 72 74  * add a new virt
44f0: 75 61 6c 20 41 4e 44 20 74 65 72 6d 20 74 6f 20  ual AND term to 
4500: 70 57 43 20 74 68 61 74 20 69 73 20 74 68 65 20  pWC that is the 
4510: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
4520: 68 65 0a 2a 2a 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a  he.** two..**.**
4530: 20 53 6f 6d 65 20 65 78 61 6d 70 6c 65 73 3a 0a   Some examples:.
4540: 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52 20  **.**    x<y OR 
4550: 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 78  x=y    -->     x
4560: 3c 3d 79 0a 2a 2a 20 20 20 20 78 3d 79 20 4f 52  <=y.**    x=y OR
4570: 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20   x=y    -->     
4580: 78 3d 79 0a 2a 2a 20 20 20 20 78 3c 3d 79 20 4f  x=y.**    x<=y O
4590: 52 20 78 3c 79 20 20 20 2d 2d 3e 20 20 20 20 20  R x<y   -->     
45a0: 78 3c 3d 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  x<=y.**.** The f
45b0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 4e 4f 54 20  ollowing is NOT 
45c0: 67 65 6e 65 72 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  generated:.**.**
45d0: 20 20 20 20 78 3c 79 20 4f 52 20 78 3e 79 20 20      x<y OR x>y  
45e0: 20 20 2d 2d 3e 20 20 20 20 20 78 21 3d 79 20 20    -->     x!=y  
45f0: 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f     .*/.static vo
4600: 69 64 20 77 68 65 72 65 43 6f 6d 62 69 6e 65 44  id whereCombineD
4610: 69 73 6a 75 6e 63 74 73 28 0a 20 20 53 72 63 4c  isjuncts(.  SrcL
4620: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
4630: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
4640: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
4650: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
4660: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
4670: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
4680: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
4690: 4f 6e 65 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  One,       /* Fi
46a0: 72 73 74 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a  rst disjunct */.
46b0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 77    WhereTerm *pTw
46c0: 6f 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  o        /* Seco
46d0: 6e 64 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a 29  nd disjunct */.)
46e0: 7b 0a 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4f  {.  u16 eOp = pO
46f0: 6e 65 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 20  ne->eOperator | 
4700: 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  pTwo->eOperator;
4710: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
4720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4730: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
4740: 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 29 20 2a 2f   (for malloc) */
4750: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20  .  Expr *pNew;  
4760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
4770: 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73 73   virtual express
4780: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 2f 2a 20 4f 70 65 72 61 74 6f 72 20 66 6f 72 20  /* Operator for 
47b0: 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 65 78 70  the combined exp
47c0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
47d0: 20 69 64 78 4e 65 77 3b 20 20 20 20 20 20 20 20   idxNew;        
47e0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
47f0: 70 57 43 20 6f 66 20 74 68 65 20 6e 65 78 74 20  pWC of the next 
4800: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 2a 2f 0a  virtual term */.
4810: 0a 20 20 69 66 28 20 28 70 4f 6e 65 2d 3e 65 4f  .  if( (pOne->eO
4820: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
4830: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
4840: 47 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29 20  GT|WO_GE))==0 ) 
4850: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70  return;.  if( (p
4860: 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Two->eOperator &
4870: 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f   (WO_EQ|WO_LT|WO
4880: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  _LE|WO_GT|WO_GE)
4890: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
48a0: 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
48b0: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  EQ|WO_LT|WO_LE))
48c0: 21 3d 65 4f 70 0a 20 20 20 26 26 20 28 65 4f 70  !=eOp.   && (eOp
48d0: 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 47 54 7c   & (WO_EQ|WO_GT|
48e0: 57 4f 5f 47 45 29 29 21 3d 65 4f 70 20 29 20 72  WO_GE))!=eOp ) r
48f0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4900: 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 4c   pOne->pExpr->pL
4910: 65 66 74 21 3d 30 20 26 26 20 70 4f 6e 65 2d 3e  eft!=0 && pOne->
4920: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30  pExpr->pRight!=0
4930: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
4940: 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  wo->pExpr->pLeft
4950: 21 3d 30 20 26 26 20 70 54 77 6f 2d 3e 70 45 78  !=0 && pTwo->pEx
4960: 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pr->pRight!=0 );
4970: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
4980: 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 4f 6e 65  prCompare(0,pOne
4990: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  ->pExpr->pLeft, 
49a0: 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  pTwo->pExpr->pLe
49b0: 66 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  ft, -1) ) return
49c0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
49d0: 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 4f 6e  xprCompare(0,pOn
49e0: 65 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e->pExpr->pRight
49f0: 2c 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70  , pTwo->pExpr->p
4a00: 52 69 67 68 74 2c 2d 31 29 20 29 72 65 74 75 72  Right,-1) )retur
4a10: 6e 3b 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  n;.  /* If we re
4a20: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
4a30: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 74 77 6f  it means the two
4a40: 20 73 75 62 74 65 72 6d 73 20 63 61 6e 20 62 65   subterms can be
4a50: 20 63 6f 6d 62 69 6e 65 64 20 2a 2f 0a 20 20 69   combined */.  i
4a60: 66 28 20 28 65 4f 70 20 26 20 28 65 4f 70 2d 31  f( (eOp & (eOp-1
4a70: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
4a80: 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
4a90: 5f 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 65 4f  _LE) ){.      eO
4aa0: 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 7d  p = WO_LE;.    }
4ab0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
4ac0: 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54  rt( eOp & (WO_GT
4ad0: 7c 57 4f 5f 47 45 29 20 29 3b 0a 20 20 20 20 20  |WO_GE) );.     
4ae0: 20 65 4f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20   eOp = WO_GE;.  
4af0: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70    }.  }.  db = p
4b00: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
4b10: 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
4b20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4b30: 64 62 2c 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2c  db, pOne->pExpr,
4b40: 20 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   0);.  if( pNew=
4b50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
4b60: 6f 72 28 6f 70 3d 54 4b 5f 45 51 3b 20 65 4f 70  or(op=TK_EQ; eOp
4b70: 21 3d 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  !=(WO_EQ<<(op-TK
4b80: 5f 45 51 29 29 3b 20 6f 70 2b 2b 29 7b 20 61 73  _EQ)); op++){ as
4b90: 73 65 72 74 28 20 6f 70 3c 54 4b 5f 47 45 20 29  sert( op<TK_GE )
4ba0: 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ; }.  pNew->op =
4bb0: 20 6f 70 3b 0a 20 20 69 64 78 4e 65 77 20 3d 20   op;.  idxNew = 
4bc0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
4bd0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
4be0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
4bf0: 59 4e 41 4d 49 43 29 3b 0a 20 20 65 78 70 72 41  YNAMIC);.  exprA
4c00: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
4c10: 2c 20 69 64 78 4e 65 77 29 3b 0a 7d 0a 0a 23 69  , idxNew);.}..#i
4c20: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4c30: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
4c40: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
4c50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4c60: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20  SUBQUERY)./*.** 
4c70: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
4c80: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
4c90: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63  two or more OR-c
4ca0: 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74  onnected.** subt
4cb0: 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a  erms.  So in:.**
4cc0: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52  .**     ... WHER
4cd0: 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d  E  (a=5) AND (b=
4ce0: 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33  7 OR c=9 OR d=13
4cf0: 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20  ) AND (d=13).** 
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e           ^^^^^^^
4d20: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a  ^^^^^^^^^^^^^.**
4d30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4d40: 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20   analyzes terms 
4d50: 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64  such as the midd
4d60: 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61  le term in the a
4d70: 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a  bove example..**
4d80: 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f   A WhereOrTerm o
4d90: 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65  bject is compute
4da0: 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74  d and attached t
4db0: 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72  o the term under
4dc0: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65  .** analysis, re
4dd0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
4de0: 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61  outcome of the a
4df0: 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a  nalysis.  Hence:
4e00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
4e10: 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c  Term.wtFlags   |
4e20: 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a  =  TERM_ORINFO.*
4e30: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
4e40: 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20  u.pOrInfo  =  a 
4e50: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
4e60: 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72  cated WhereOrTer
4e70: 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54  m object.**.** T
4e80: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e  he term being an
4e90: 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65  alyzed must have
4ea0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20   two or more of 
4eb0: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  OR-connected sub
4ec0: 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67  terms..** A sing
4ed0: 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74  le subterm might
4ee0: 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44   be a set of AND
4ef0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73  -connected sub-s
4f00: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d  ubterms..** Exam
4f10: 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e  ples of terms un
4f20: 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a  der analysis:.**
4f30: 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20  .**     (A)     
4f40: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e  t1.x=t2.y OR t1.
4f50: 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31  x=t2.z OR t1.y=1
4f60: 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35  5 OR t1.z=t3.a+5
4f70: 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20  .**     (B)     
4f80: 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32  x=expr1 OR expr2
4f90: 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a  =x OR x=expr3.**
4fa0: 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e       (C)     t1.
4fb0: 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d  x=t2.y OR (t1.x=
4fc0: 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35  t2.z AND t1.y=15
4fd0: 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20  ).**     (D)    
4fe0: 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31   x=expr1 OR (y>1
4ff0: 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a  1 AND y<22 AND z
5000: 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29   LIKE '*hello*')
5010: 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20  .**     (E)     
5020: 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32  (p.a=1 AND q.b=2
5030: 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28   AND r.c=3) OR (
5040: 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20  p.x=4 AND q.y=5 
5050: 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 20 20 20  AND r.z=6).**   
5060: 20 20 28 46 29 20 20 20 20 20 78 3e 41 20 4f 52    (F)     x>A OR
5070: 20 28 78 3d 41 20 41 4e 44 20 79 3e 3d 42 29 0a   (x=A AND y>=B).
5080: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
5090: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
50a0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
50b0: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
50c0: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
50d0: 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20  umn of C and.** 
50e0: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
50f0: 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78   (as shown in ex
5100: 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74  ample B above) t
5110: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
5120: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
5130: 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69   that is an equi
5140: 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73  valent IN expres
5150: 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  sion.  In other 
5160: 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65  words, if the te
5170: 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c  rm.** being anal
5180: 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  yzed is:.**.**  
5190: 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f      x = expr1  O
51a0: 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52  R  expr2 = x  OR
51b0: 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a    x = expr3.**.*
51c0: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
51d0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
51e0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
51f0: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70  *      x IN (exp
5200: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
5210: 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a  **.** CASE 2:.**
5220: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
5230: 20 65 78 61 63 74 6c 79 20 74 77 6f 20 64 69 73   exactly two dis
5240: 6a 75 6e 63 74 73 20 61 6e 64 20 6f 6e 65 20 73  juncts and one s
5250: 69 64 65 20 68 61 73 20 78 3e 41 20 61 6e 64 20  ide has x>A and 
5260: 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 0a 2a  the other side.*
5270: 2a 20 68 61 73 20 78 3d 41 20 28 66 6f 72 20 74  * has x=A (for t
5280: 68 65 20 73 61 6d 65 20 78 20 61 6e 64 20 41 29  he same x and A)
5290: 20 74 68 65 6e 20 61 64 64 20 61 20 6e 65 77 20   then add a new 
52a0: 76 69 72 74 75 61 6c 20 63 6f 6e 6a 75 6e 63 74  virtual conjunct
52b0: 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20   term to the.** 
52c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
52d0: 74 68 65 20 66 6f 72 6d 20 22 78 3e 3d 41 22 2e  the form "x>=A".
52e0: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
52f0: 20 20 20 20 20 20 78 3e 41 20 4f 52 20 28 78 3d        x>A OR (x=
5300: 41 20 41 4e 44 20 79 3e 42 29 20 20 20 20 61 64  A AND y>B)    ad
5310: 64 73 3a 20 20 20 20 78 3e 3d 41 0a 2a 2a 0a 2a  ds:    x>=A.**.*
5320: 2a 20 54 68 65 20 61 64 64 65 64 20 63 6f 6e 6a  * The added conj
5330: 75 6e 63 74 20 63 61 6e 20 73 6f 6d 65 74 69 6d  unct can sometim
5340: 65 73 20 62 65 20 68 65 6c 70 66 75 6c 20 69 6e  es be helpful in
5350: 20 71 75 65 72 79 20 70 6c 61 6e 6e 69 6e 67 2e   query planning.
5360: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 33 3a 0a 2a  .**.** CASE 3:.*
5370: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
5380: 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62  erms are indexab
5390: 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74  le by a single t
53a0: 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74  able T, then set
53b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
53c0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20  Term.eOperator  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57              =  W
53e0: 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72  O_OR.**     Wher
53f0: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d  eTerm.u.pOrInfo-
5400: 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20  >indexable  |=  
5410: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
5420: 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a  r for table T.**
5430: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
5440: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20   "indexable" if 
5450: 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  it is of the for
5460: 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c  m.** "T.C <op> <
5470: 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69  expr>" where C i
5480: 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  s any column of 
5490: 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20  table T and .** 
54a0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22  <op> is one of "
54b0: 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22  =", "<", "<=", "
54c0: 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55  >", ">=", "IS NU
54d0: 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a  LL", or "IN"..**
54e0: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c   A subterm is al
54f0: 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20  so indexable if 
5500: 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20  it is an AND of 
5510: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73  two or more.** s
5520: 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65  ubsubterms at le
5530: 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68  ast one of which
5540: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20   is indexable.  
5550: 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a  Indexable AND .*
5560: 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20  * subterms have 
5570: 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20  their eOperator 
5580: 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e  set to WO_AND an
5590: 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75  d they have.** u
55a0: 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f  .pAndInfo set to
55b0: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
55c0: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e  llocated WhereAn
55d0: 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a  dTerm object..**
55e0: 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  .** From another
55f0: 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20   point of view, 
5600: 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e  "indexable" mean
5610: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65  s that the subte
5620: 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65  rm could.** pote
5630: 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ntially be used 
5640: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66  with an index if
5650: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
5660: 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a  index exists..**
5670: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64   This analysis d
5680: 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72  oes not consider
5690: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
56a0: 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  the index exists
56b0: 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65 63  ; that.** is dec
56c0: 69 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e 20  ided elsewhere. 
56d0: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 6f   This analysis o
56e0: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
56f0: 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a  ther subterms.**
5700: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5710: 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e   indexing exist.
5720: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70  .**.** All examp
5730: 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20  les A through E 
5740: 61 62 6f 76 65 20 73 61 74 69 73 66 79 20 63 61  above satisfy ca
5750: 73 65 20 33 2e 20 20 42 75 74 20 69 66 20 61 20  se 3.  But if a 
5760: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74  term.** also sat
5770: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73  isfies case 1 (s
5780: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f  uch as B) we kno
5790: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  w that the optim
57a0: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77  izer will.** alw
57b0: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20  ays prefer case 
57c0: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  1, so in that ca
57d0: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68  se we pretend th
57e0: 61 74 20 63 61 73 65 20 33 20 69 73 20 6e 6f 74  at case 3 is not
57f0: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a  .** satisfied..*
5800: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65  *.** It might be
5810: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d   the case that m
5820: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61  ultiple tables a
5830: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46  re indexable.  F
5840: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28  or example,.** (
5850: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65  E) above is inde
5860: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20  xable on tables 
5870: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a  P, Q, and R..**.
5880: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61  ** Terms that sa
5890: 74 69 73 66 79 20 63 61 73 65 20 33 20 61 72 65  tisfy case 3 are
58a0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
58b0: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a  lookup by using.
58c0: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  ** separate indi
58d0: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69  ces to find rowi
58e0: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74  ds for each subt
58f0: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e  erm and composin
5900: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f  g.** the union o
5910: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69  f all rowids usi
5920: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
5930: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ct.  This is sim
5940: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d  ilar.** to "bitm
5950: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f  ap indices" in o
5960: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e  ther database en
5970: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48  gines..**.** OTH
5980: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66  ERWISE:.**.** If
5990: 20 6e 6f 6e 65 20 6f 66 20 63 61 73 65 73 20 31   none of cases 1
59a0: 2c 20 32 2c 20 6f 72 20 33 20 61 70 70 6c 79 2c  , 2, or 3 apply,
59b0: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
59c0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
59d0: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
59e0: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
59f0: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
5a00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5a10: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
5a20: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
5a30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5a40: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5a50: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5a60: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
5a70: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
5a80: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
5a90: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
5aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
5ab0: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
5ac0: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
5ad0: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  d */.){.  WhereI
5ae0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57  nfo *pWInfo = pW
5af0: 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  C->pWInfo;      
5b00: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
5b10: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  e processing con
5b20: 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
5b30: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
5b40: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
5b50: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5b60: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
5b70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5b80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
5b90: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
5ba0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
5bb0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
5bc0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
5bd0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
5be0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
5bf0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
5c00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c20: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
5c30: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
5c40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5c70: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
5c80: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
5c90: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
5ca0: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
5cb0: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
5cc0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
5cd0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
5ce0: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
5cf0: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
5d00: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
5d10: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
5d20: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5d30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5d40: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
5d50: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
5d60: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
5d70: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
5d80: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
5d90: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
5da0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
5db0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
5dc0: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
5dd0: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
5de0: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
5df0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
5e00: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
5e10: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
5e20: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
5e30: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
5e40: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
5e50: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
5e60: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
5e70: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
5e80: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
5e90: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
5ea0: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
5eb0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
5ec0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
5ed0: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
5ee0: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
5ef0: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
5f00: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
5f10: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
5f20: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
5f30: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
5f40: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
5f50: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
5f60: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
5f70: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
5f80: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
5f90: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
5fa0: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
5fb0: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 6d 65 6d  rInfo->wc;.  mem
5fc0: 73 65 74 28 70 4f 72 57 63 2d 3e 61 53 74 61 74  set(pOrWc->aStat
5fd0: 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  ic, 0, sizeof(pO
5fe0: 72 57 63 2d 3e 61 53 74 61 74 69 63 29 29 3b 0a  rWc->aStatic));.
5ff0: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
6000: 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20  auseInit(pOrWc, 
6010: 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
6020: 65 33 57 68 65 72 65 53 70 6c 69 74 28 70 4f 72  e3WhereSplit(pOr
6030: 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Wc, pExpr, TK_OR
6040: 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  );.  sqlite3Wher
6050: 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72  eExprAnalyze(pSr
6060: 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28  c, pOrWc);.  if(
6070: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6080: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
6090: 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65  sert( pOrWc->nTe
60a0: 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20  rm>=2 );..  /*. 
60b0: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   ** Compute the 
60c0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
60d0: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
60e0: 20 63 61 73 65 73 20 31 20 6f 72 20 33 2e 0a 20   cases 1 or 3.. 
60f0: 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20   */.  indexable 
6100: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
6110: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69   chngToIN = ~(Bi
6120: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
6130: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
6140: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
6150: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78  a; i>=0 && index
6160: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  able; i--, pOrTe
6170: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
6180: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
6190: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d  or & WO_SINGLE)=
61a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
61b0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e  eAndInfo *pAndIn
61c0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
61d0: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  ( (pOrTerm->wtFl
61e0: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49  ags & (TERM_ANDI
61f0: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  NFO|TERM_ORINFO)
6200: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68  )==0 );.      ch
6210: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
6220: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c    pAndInfo = sql
6230: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6240: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41  N(db, sizeof(*pA
6250: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  ndInfo));.      
6260: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a  if( pAndInfo ){.
6270: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
6280: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20  use *pAndWC;.   
6290: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
62a0: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20  pAndTerm;.      
62b0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
62c0: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a   Bitmask b = 0;.
62d0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
62e0: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41  >u.pAndInfo = pA
62f0: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ndInfo;.        
6300: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
6310: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   |= TERM_ANDINFO
6320: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
6330: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
6340: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  O_AND;.        p
6350: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66  AndWC = &pAndInf
6360: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 6d  o->wc;.        m
6370: 65 6d 73 65 74 28 70 41 6e 64 57 43 2d 3e 61 53  emset(pAndWC->aS
6380: 74 61 74 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66  tatic, 0, sizeof
6390: 28 70 41 6e 64 57 43 2d 3e 61 53 74 61 74 69 63  (pAndWC->aStatic
63a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
63b0: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e  te3WhereClauseIn
63c0: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
63d0: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
63e0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c   sqlite3WhereSpl
63f0: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65  it(pAndWC, pOrTe
6400: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e  rm->pExpr, TK_AN
6410: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
6420: 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c  te3WhereExprAnal
6430: 79 7a 65 28 70 53 72 63 2c 20 70 41 6e 64 57 43  yze(pSrc, pAndWC
6440: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  );.        pAndW
6450: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b  C->pOuter = pWC;
6460: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
6470: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6480: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
6490: 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41  j=0, pAndTerm=pA
64a0: 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57  ndWC->a; j<pAndW
64b0: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
64c0: 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  AndTerm++){.    
64d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
64e0: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20  pAndTerm->pExpr 
64f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
6500: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e  f( allowedOp(pAn
6510: 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  dTerm->pExpr->op
6520: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
6530: 7c 7c 20 70 41 6e 64 54 65 72 6d 2d 3e 65 4f 70  || pAndTerm->eOp
6540: 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 55 58 0a 20  erator==WO_AUX. 
6550: 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
6560: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
6570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
6580: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
6590: 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d  askSet, pAndTerm
65a0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
65b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
65c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
65d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78   }.        index
65e0: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
65f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
6600: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
6610: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
6620: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  ){.      /* Skip
6630: 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e   this term for n
6640: 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20  ow.  We revisit 
6650: 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65  it when we proce
6660: 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ss the.      ** 
6670: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45  corresponding TE
6680: 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20  RM_VIRTUAL term 
6690: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
66a0: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20      Bitmask b;. 
66b0: 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65 33       b = sqlite3
66c0: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
66d0: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
66e0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
66f0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
6700: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
6710: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
6720: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
6730: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26  Term *pOther = &
6740: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d  pOrWc->a[pOrTerm
6750: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
6760: 20 20 20 20 62 20 7c 3d 20 73 71 6c 69 74 65 33      b |= sqlite3
6770: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
6780: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
6790: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
67a0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
67b0: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
67c0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f  b;.      if( (pO
67d0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
67e0: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a   & WO_EQ)==0 ){.
67f0: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
6800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
6810: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  e{.        chngT
6820: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  oIN &= b;.      
6830: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
6840: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68  *.  ** Record th
6850: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
6860: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
6870: 65 20 33 2e 20 20 54 68 65 20 73 65 74 20 6d 69  e 3.  The set mi
6880: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74  ght be.  ** empt
6890: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66  y..  */.  pOrInf
68a0: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69  o->indexable = i
68b0: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 69 66 28 20  ndexable;.  if( 
68c0: 69 6e 64 65 78 61 62 6c 65 20 29 7b 0a 20 20 20  indexable ){.   
68d0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
68e0: 72 20 3d 20 57 4f 5f 4f 52 3b 0a 20 20 20 20 70  r = WO_OR;.    p
68f0: 57 43 2d 3e 68 61 73 4f 72 20 3d 20 31 3b 0a 20  WC->hasOr = 1;. 
6900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72   }else{.    pTer
6910: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
6920: 4f 5f 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  O_OR;.  }..  /* 
6930: 46 6f 72 20 61 20 74 77 6f 2d 77 61 79 20 4f 52  For a two-way OR
6940: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6d 70  , attempt to imp
6950: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 73 65  lementation case
6960: 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69   2..  */.  if( i
6970: 6e 64 65 78 61 62 6c 65 20 26 26 20 70 4f 72 57  ndexable && pOrW
6980: 63 2d 3e 6e 54 65 72 6d 3d 3d 32 20 29 7b 0a 20  c->nTerm==2 ){. 
6990: 20 20 20 69 6e 74 20 69 4f 6e 65 20 3d 20 30 3b     int iOne = 0;
69a0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
69b0: 70 4f 6e 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  pOne;.    while(
69c0: 20 28 70 4f 6e 65 20 3d 20 77 68 65 72 65 4e 74   (pOne = whereNt
69d0: 68 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63 2d  hSubterm(&pOrWc-
69e0: 3e 61 5b 30 5d 2c 69 4f 6e 65 2b 2b 29 29 21 3d  >a[0],iOne++))!=
69f0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
6a00: 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 57  Two = 0;.      W
6a10: 68 65 72 65 54 65 72 6d 20 2a 70 54 77 6f 3b 0a  hereTerm *pTwo;.
6a20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 54        while( (pT
6a30: 77 6f 20 3d 20 77 68 65 72 65 4e 74 68 53 75 62  wo = whereNthSub
6a40: 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e 61 5b 31  term(&pOrWc->a[1
6a50: 5d 2c 69 54 77 6f 2b 2b 29 29 21 3d 30 20 29 7b  ],iTwo++))!=0 ){
6a60: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f  .        whereCo
6a70: 6d 62 69 6e 65 44 69 73 6a 75 6e 63 74 73 28 70  mbineDisjuncts(p
6a80: 53 72 63 2c 20 70 57 43 2c 20 70 4f 6e 65 2c 20  Src, pWC, pOne, 
6a90: 70 54 77 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTwo);.      }. 
6aa0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
6ab0: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c   ** chngToIN hol
6ac0: 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c  ds a set of tabl
6ad0: 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20  es that *might* 
6ae0: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20  satisfy case 1. 
6af0: 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76   But.  ** we hav
6b00: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64  e to do some add
6b10: 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67  itional checking
6b20: 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20   to see if case 
6b30: 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73  1 really.  ** is
6b40: 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a   satisfied..  **
6b50: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77  .  ** chngToIN w
6b60: 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20  ill hold either 
6b70: 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e  0, 1, or 2 bits.
6b80: 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65    The 0-bit case
6b90: 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
6ba0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73   there is no pos
6bb0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e  sibility of tran
6bc0: 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20  sforming the OR 
6bd0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20  clause into an. 
6be0: 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   ** IN operator 
6bf0: 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d  because one or m
6c00: 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ore terms in the
6c10: 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   OR clause conta
6c20: 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e  in.  ** somethin
6c30: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20  g other than == 
6c40: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  on a column in t
6c50: 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  he single table.
6c60: 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a    The 1-bit.  **
6c70: 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74   case means that
6c80: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
6c90: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20  he OR clause is 
6ca0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a  of the form.  **
6cb0: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65   "table.column=e
6cc0: 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69  xpr" for some si
6cd0: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
6ce0: 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73   one bit that is
6cf0: 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63   set.  ** will c
6d00: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
6d10: 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20   common table.  
6d20: 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  We still need to
6d30: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20   check to make. 
6d40: 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d   ** sure the sam
6d50: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  e column is used
6d60: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20   on all terms.  
6d70: 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69  The 2-bit case i
6d80: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  s when.  ** the 
6d90: 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66  all terms are of
6da0: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
6db0: 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e  1.column=table2.
6dc0: 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a  column".  It.  *
6dd0: 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69  * might be possi
6de0: 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49  ble to form an I
6df0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
6e00: 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f  either table1.co
6e10: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62  lumn.  ** or tab
6e20: 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68  le2.column as th
6e30: 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20  e LHS if either 
6e40: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65  is common to eve
6e50: 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20  ry term of.  ** 
6e60: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20  the OR clause.. 
6e70: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
6e80: 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  at terms of the 
6e90: 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75  form "table.colu
6ea0: 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  mn1=table.column
6eb0: 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d  2" (the.  ** sam
6ec0: 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20  e table on both 
6ed0: 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29  sizes of the ==)
6ee0: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d   cannot be optim
6ef0: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
6f00: 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20   chngToIN ){.   
6f10: 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   int okToChngToI
6f20: 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  N = 0;     /* Tr
6f30: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ue if the conver
6f40: 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61  sion to IN is va
6f50: 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  lid */.    int i
6f60: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20  Column = -1;    
6f70: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69       /* Column i
6f80: 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49  ndex on lhs of I
6f90: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
6fa0: 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20    int iCursor = 
6fb0: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  -1;         /* T
6fc0: 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d  able cursor comm
6fd0: 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20  on to all terms 
6fe0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30  */.    int j = 0
6ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7000: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7010: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72   */..    /* Sear
7020: 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61  ch for a table a
7030: 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61  nd column that a
7040: 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69  ppears on one si
7050: 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  de or the.    **
7060: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d   other of the ==
7070: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65   operator in eve
7080: 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61  ry subterm.  Tha
7090: 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
70a0: 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  mn.    ** will b
70b0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43  e recorded in iC
70c0: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d  ursor and iColum
70d0: 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20  n.  There might 
70e0: 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a  not be any.    *
70f0: 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64  * such table and
7100: 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b   column.  Set ok
7110: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e  ToChngToIN if an
7120: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62   appropriate tab
7130: 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f  le.    ** and co
7140: 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75  lumn is found bu
7150: 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67  t leave okToChng
7160: 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f  ToIN false if no
7170: 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a  t found..    */.
7180: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32      for(j=0; j<2
7190: 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49   && !okToChngToI
71a0: 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  N; j++){.      p
71b0: 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e  OrTerm = pOrWc->
71c0: 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  a;.      for(i=p
71d0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69  OrWc->nTerm-1; i
71e0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  >=0; i--, pOrTer
71f0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
7200: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
7210: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
7220: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   );.        pOrT
7230: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
7240: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
7250: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
7260: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
7270: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
7280: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
7290: 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64  e 2-bit case and
72a0: 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73   we are on the s
72b0: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
72c0: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
72d0: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
72e0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
72f0: 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73  iteration.  So s
7300: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a  kip this term. *
7310: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
7320: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
7330: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7340: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7350: 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20    if( (chngToIN 
7360: 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  & sqlite3WhereGe
7370: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
7380: 4d 61 73 6b 53 65 74 2c 0a 20 20 20 20 20 20 20  MaskSet,.       
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 6c 65       pOrTerm->le
73c0: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b  ftCursor))==0 ){
73d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
73e0: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  is term must be 
73f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61  of the form t1.a
7400: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20  ==t2.b where t2 
7410: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  is in the.      
7420: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20      ** chngToIN 
7430: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f  set but t1 is no
7440: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69  t.  This term wi
7450: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65  ll be either pre
7460: 63 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  ceded.          
7470: 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79  ** or follwed by
7480: 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70   an inverted cop
7490: 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20  y (t2.b==t1.a). 
74a0: 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20   Skip this term 
74b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
74c0: 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73  d use its invers
74d0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
74e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54    testcase( pOrT
74f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
7500: 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20  ERM_COPIED );.  
7510: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
7520: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
7530: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
7540: 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  L );.          a
7550: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
7560: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
7570: 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54  COPIED|TERM_VIRT
7580: 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  UAL) );.        
7590: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
75a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43      }.        iC
75b0: 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d  olumn = pOrTerm-
75c0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
75d0: 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d         iCursor =
75e0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
75f0: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72  rsor;.        br
7600: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
7610: 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
7620: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64        /* No cand
7630: 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75  idate table+colu
7640: 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54  mn was found.  T
7650: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
7660: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  ur.        ** on
7670: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
7680: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
7690: 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b   assert( j==1 );
76a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
76b0: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68   IsPowerOfTwo(ch
76c0: 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20  ngToIN) );.     
76d0: 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54     assert( chngT
76e0: 6f 49 4e 3d 3d 73 71 6c 69 74 65 33 57 68 65 72  oIN==sqlite3Wher
76f0: 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
7700: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
7710: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
7720: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
7730: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
7740: 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
7750: 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61   We have found a
7760: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
7770: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68   and column.  Ch
7780: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
7790: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  at.      ** tabl
77a0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  e and column is 
77b0: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
77c0: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63  term in the OR c
77d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f  lause */.      o
77e0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b  kToChngToIN = 1;
77f0: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d  .      for(; i>=
7800: 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  0 && okToChngToI
7810: 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  N; i--, pOrTerm+
7820: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
7830: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
7840: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
7850: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
7860: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
7870: 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r!=iCursor ){.  
7880: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
7890: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
78a0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
78b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
78c0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
78d0: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  !=iColumn ){.   
78e0: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
78f0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
7900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7910: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
7920: 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  ffRight;.       
7930: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67     /* If the rig
7940: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
7950: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
7960: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
7970: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
7980: 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e  of both right an
7990: 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73  d left sides mus
79a0: 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e  t be such that n
79b0: 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20  o type.         
79c0: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20   ** conversions 
79d0: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
79e0: 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63  the right.  (Tic
79f0: 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20  ket #2249).     
7a00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7a10: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
7a20: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
7a30: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
7a40: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
7a50: 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71      affLeft = sq
7a60: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
7a70: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
7a80: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
7a90: 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74      if( affRight
7aa0: 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21  !=0 && affRight!
7ab0: 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20  =affLeft ){.    
7ac0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
7ad0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
7ae0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7af0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
7b00: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
7b10: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  OR_OK;.         
7b20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7b30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
7b40: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
7b50: 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  , okToChngToIN i
7b60: 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e  s true if origin
7b70: 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69  al pTerm satisfi
7b80: 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31  es.    ** case 1
7b90: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
7ba0: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
7bb0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68   virtual term th
7bc0: 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54  at is .    ** pT
7bd0: 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  erm converted in
7be0: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
7bf0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
7c00: 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29  ( okToChngToIN )
7c10: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
7c20: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  up;            /
7c30: 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75  * A transient du
7c40: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69  plicate expressi
7c50: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
7c60: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
7c70: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66     /* The RHS of
7c80: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
7c90: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
7ca0: 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20  pLeft = 0;      
7cb0: 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
7cc0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
7cd0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  /.      Expr *pN
7ce0: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
7cf0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49  * The complete I
7d00: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  N operator */.. 
7d10: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
7d20: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
7d30: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
7d40: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
7d50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
7d60: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
7d70: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d  s & TERM_OR_OK)=
7d80: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7d90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7da0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
7db0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20  r & WO_EQ );.   
7dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
7dd0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
7de0: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
7df0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
7e00: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
7e10: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
7e20: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
7e30: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7e40: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
7e50: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
7e60: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
7e70: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
7e80: 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  nd(pWInfo->pPars
7e90: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b  e, pList, pDup);
7ea0: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
7eb0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
7ec0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a  >pLeft;.      }.
7ed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
7ee0: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
7ef0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
7f00: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
7f10: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
7f20: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7f30: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44  Parse, TK_IN, pD
7f40: 75 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  up, 0);.      if
7f50: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
7f60: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
7f70: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
7f80: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
7f90: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
7fa0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
7fb0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
7fc0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
7fd0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
7fe0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
7ff0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
8000: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
8010: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
8020: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
8030: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
8040: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
8050: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
8060: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
8070: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
8080: 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 72  .        /* pTer
8090: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
80a0: 65 72 6d 5d 3b 20 2f 2f 20 77 6f 75 6c 64 20 62  erm]; // would b
80b0: 65 20 6e 65 65 64 65 64 20 69 66 20 70 54 65 72  e needed if pTer
80c0: 6d 20 77 68 65 72 65 20 75 73 65 64 20 61 67 61  m where used aga
80d0: 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61  in */.        ma
80e0: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
80f0: 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65  C, idxNew, idxTe
8100: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
8110: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8120: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8130: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
8140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
8150: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
8160: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
8170: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
8180: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
8190: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 6c 72  */../*.** We alr
81a0: 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74 20 70  eady know that p
81b0: 45 78 70 72 20 69 73 20 61 20 62 69 6e 61 72 79  Expr is a binary
81c0: 20 6f 70 65 72 61 74 6f 72 20 77 68 65 72 65 20   operator where 
81d0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
81e0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65 66 65  e.** column refe
81f0: 72 65 6e 63 65 73 2e 20 20 54 68 69 73 20 72 6f  rences.  This ro
8200: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 6f 20  utine checks to 
8210: 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
8220: 61 6e 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a  an equivalence.*
8230: 2a 20 72 65 6c 61 74 69 6f 6e 3a 0a 2a 2a 20 20  * relation:.**  
8240: 20 31 2e 20 20 54 68 65 20 53 51 4c 49 54 45 5f   1.  The SQLITE_
8250: 54 72 61 6e 73 69 74 69 76 65 20 6f 70 74 69 6d  Transitive optim
8260: 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ization must be 
8270: 65 6e 61 62 6c 65 64 0a 2a 2a 20 20 20 32 2e 20  enabled.**   2. 
8280: 20 4d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   Must be either 
8290: 61 6e 20 3d 3d 20 6f 72 20 61 6e 20 49 53 20 6f  an == or an IS o
82a0: 70 65 72 61 74 6f 72 0a 2a 2a 20 20 20 33 2e 20  perator.**   3. 
82b0: 20 4e 6f 74 20 6f 72 69 67 69 6e 61 74 69 6e 67   Not originating
82c0: 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
82d0: 65 20 6f 66 20 61 6e 20 4f 55 54 45 52 20 4a 4f  e of an OUTER JO
82e0: 49 4e 0a 2a 2a 20 20 20 34 2e 20 20 54 68 65 20  IN.**   4.  The 
82f0: 61 66 66 69 6e 69 74 69 65 73 20 6f 66 20 41 20  affinities of A 
8300: 61 6e 64 20 42 20 6d 75 73 74 20 62 65 20 63 6f  and B must be co
8310: 6d 70 61 74 69 62 6c 65 0a 2a 2a 20 20 20 35 61  mpatible.**   5a
8320: 2e 20 42 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  . Both operands 
8330: 75 73 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  use the same col
8340: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8350: 4f 52 0a 2a 2a 20 20 20 35 62 2e 20 54 68 65 20  OR.**   5b. The 
8360: 6f 76 65 72 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e  overall collatin
8370: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 42 49  g sequence is BI
8380: 4e 41 52 59 0a 2a 2a 20 49 66 20 74 68 69 73 20  NARY.** If this 
8390: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
83a0: 54 52 55 45 2c 20 74 68 61 74 20 6d 65 61 6e 73  TRUE, that means
83b0: 20 74 68 61 74 20 74 68 65 20 52 48 53 20 63 61   that the RHS ca
83c0: 6e 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  n be substituted
83d0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 4c 48 53 20  .** for the LHS 
83e0: 61 6e 79 70 6c 61 63 65 20 65 6c 73 65 20 69 6e  anyplace else in
83f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
8400: 65 20 77 68 65 72 65 20 74 68 65 20 4c 48 53 20  e where the LHS 
8410: 63 6f 6c 75 6d 6e 20 6f 63 63 75 72 73 2e 0a 2a  column occurs..*
8420: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
8430: 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4e 6f 20 68  imization.  No h
8440: 61 72 6d 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72  arm comes from r
8450: 65 74 75 72 6e 69 6e 67 20 30 2e 20 20 42 75 74  eturning 0.  But
8460: 20 69 66 20 31 20 69 73 0a 2a 2a 20 72 65 74 75   if 1 is.** retu
8470: 72 6e 65 64 20 77 68 65 6e 20 69 74 20 73 68 6f  rned when it sho
8480: 75 6c 64 20 6e 6f 74 20 62 65 2c 20 74 68 65 6e  uld not be, then
8490: 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
84a0: 72 73 20 6d 69 67 68 74 20 72 65 73 75 6c 74 2e  rs might result.
84b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
84c0: 65 72 6d 49 73 45 71 75 69 76 61 6c 65 6e 63 65  ermIsEquivalence
84d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
84e0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
84f0: 63 68 61 72 20 61 66 66 31 2c 20 61 66 66 32 3b  char aff1, aff2;
8500: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
8510: 6c 3b 0a 20 20 69 66 28 20 21 4f 70 74 69 6d 69  l;.  if( !Optimi
8520: 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
8530: 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
8540: 5f 54 72 61 6e 73 69 74 69 76 65 29 20 29 20 72  _Transitive) ) r
8550: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
8560: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
8570: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
8580: 5f 49 53 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  _IS ) return 0;.
8590: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
85a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
85b0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
85c0: 72 6e 20 30 3b 0a 20 20 61 66 66 31 20 3d 20 73  rn 0;.  aff1 = s
85d0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
85e0: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
85f0: 3b 0a 20 20 61 66 66 32 20 3d 20 73 71 6c 69 74  ;.  aff2 = sqlit
8600: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
8610: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
8620: 20 69 66 28 20 61 66 66 31 21 3d 61 66 66 32 0a   if( aff1!=aff2.
8630: 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
8640: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
8650: 28 61 66 66 31 29 20 7c 7c 20 21 73 71 6c 69 74  (aff1) || !sqlit
8660: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
8670: 69 74 79 28 61 66 66 32 29 29 0a 20 20 29 7b 0a  ity(aff2)).  ){.
8680: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8690: 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  }.  pColl = sqli
86a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
86b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
86c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
86d0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
86e0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e  if( sqlite3IsBin
86f0: 61 72 79 28 70 43 6f 6c 6c 29 20 29 20 72 65 74  ary(pColl) ) ret
8700: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
8710: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
8720: 65 71 4d 61 74 63 68 28 70 50 61 72 73 65 2c 20  eqMatch(pParse, 
8730: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
8740: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 7d 0a  xpr->pRight);.}.
8750: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
8760: 6c 79 20 77 61 6c 6b 20 74 68 65 20 65 78 70 72  ly walk the expr
8770: 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53 45 4c  essions of a SEL
8780: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
8790: 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20  d generate.** a 
87a0: 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69  bitmask indicati
87b0: 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20  ng which tables 
87c0: 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74  are used in that
87d0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
87e0: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ree..*/.static B
87f0: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63  itmask exprSelec
8800: 74 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  tUsage(WhereMask
8810: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
8820: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
8830: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
8840: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
8850: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
8860: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
8870: 20 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33   mask |= sqlite3
8880: 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
8890: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
88a0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61  >pEList);.    ma
88b0: 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  sk |= sqlite3Whe
88c0: 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28  reExprListUsage(
88d0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47  pMaskSet, pS->pG
88e0: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73  roupBy);.    mas
88f0: 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  k |= sqlite3Wher
8900: 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
8910: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
8920: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
8930: 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
8940: 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b 53  ExprUsage(pMaskS
8950: 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b  et, pS->pWhere);
8960: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c  .    mask |= sql
8970: 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61  ite3WhereExprUsa
8980: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
8990: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69  >pHaving);.    i
89a0: 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d  f( ALWAYS(pSrc!=
89b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0) ){.      int 
89c0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
89d0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
89e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  i++){.        ma
89f0: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
8a00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
8a10: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
8a20: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  ct);.        mas
8a30: 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  k |= sqlite3Wher
8a40: 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b  eExprUsage(pMask
8a50: 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  Set, pSrc->a[i].
8a60: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pOn);.        if
8a70: 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e  ( pSrc->a[i].fg.
8a80: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
8a90: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73         mask |= s
8aa0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
8ab0: 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
8ac0: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 75 31  t, pSrc->a[i].u1
8ad0: 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20  .pFuncArg);.    
8ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8af0: 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53 2d    }.    pS = pS-
8b00: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72  >pPrior;.  }.  r
8b10: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f  eturn mask;.}../
8b20: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
8b30: 70 45 78 70 72 20 69 73 20 6f 6e 65 20 6f 70 65  pExpr is one ope
8b40: 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72  rand of a compar
8b50: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 74 68  ison operator th
8b60: 61 74 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 75  at might.** be u
8b70: 73 65 66 75 6c 20 66 6f 72 20 69 6e 64 65 78 69  seful for indexi
8b80: 6e 67 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ng.  This routin
8b90: 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  e checks to see 
8ba0: 69 66 20 70 45 78 70 72 20 61 70 70 65 61 72 73  if pExpr appears
8bb0: 0a 2a 2a 20 69 6e 20 61 6e 79 20 69 6e 64 65 78  .** in any index
8bc0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
8bd0: 31 29 20 69 66 20 70 45 78 70 72 20 69 73 20 61  1) if pExpr is a
8be0: 6e 20 69 6e 64 65 78 65 64 20 74 65 72 6d 20 61  n indexed term a
8bf0: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 46 41 4c  nd return.** FAL
8c00: 53 45 20 28 30 29 20 69 66 20 6e 6f 74 2e 20 20  SE (0) if not.  
8c10: 49 66 20 54 52 55 45 20 69 73 20 72 65 74 75 72  If TRUE is retur
8c20: 6e 65 64 2c 20 61 6c 73 6f 20 73 65 74 20 61 69  ned, also set ai
8c30: 43 75 72 43 6f 6c 5b 30 5d 20 74 6f 20 74 68 65  CurCol[0] to the
8c40: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
8c50: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  r of the table t
8c60: 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 61  hat is indexed a
8c70: 6e 64 20 61 69 43 75 72 43 6f 6c 5b 31 5d 20 74  nd aiCurCol[1] t
8c80: 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  o the column num
8c90: 62 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 63 6f  ber.** of the co
8ca0: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 64  lumn that is ind
8cb0: 65 78 65 64 2c 20 6f 72 20 58 4e 5f 45 58 50 52  exed, or XN_EXPR
8cc0: 20 28 2d 32 29 20 69 66 20 61 6e 20 65 78 70 72   (-2) if an expr
8cd0: 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a  ession is being.
8ce0: 2a 2a 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a  ** indexed..**.*
8cf0: 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
8d00: 54 4b 5f 43 4f 4c 55 4d 4e 20 63 6f 6c 75 6d 6e  TK_COLUMN column
8d10: 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e   reference, then
8d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
8d30: 77 61 79 73 20 72 65 74 75 72 6e 73 0a 2a 2a 20  ways returns.** 
8d40: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 61  true even if tha
8d50: 74 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  t particular col
8d60: 75 6d 6e 20 69 73 20 6e 6f 74 20 69 6e 64 65 78  umn is not index
8d70: 65 64 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  ed, because the 
8d80: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6d 69 67 68 74 20  column.** might 
8d90: 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 61  be added to an a
8da0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6c  utomatic index l
8db0: 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
8dc0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
8dd0: 69 6e 74 20 65 78 70 72 4d 69 67 68 74 42 65 49  int exprMightBeI
8de0: 6e 64 65 78 65 64 32 28 0a 20 20 53 72 63 4c 69  ndexed2(.  SrcLi
8df0: 73 74 20 2a 70 46 72 6f 6d 2c 20 20 20 20 20 20  st *pFrom,      
8e00: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
8e10: 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ause */.  Bitmas
8e20: 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20  k mPrereq,      
8e30: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 46   /* Bitmask of F
8e40: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
8e50: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70   referenced by p
8e60: 45 78 70 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  Expr */.  int *a
8e70: 69 43 75 72 43 6f 6c 2c 20 20 20 20 20 20 20 20  iCurCol,        
8e80: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
8e90: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 63  ferenced table c
8ea0: 75 72 73 6f 72 20 61 6e 64 20 63 6f 6c 75 6d 6e  ursor and column
8eb0: 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 20   here */.  Expr 
8ec0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
8ed0: 20 20 2f 2a 20 41 6e 20 6f 70 65 72 61 6e 64 20    /* An operand 
8ee0: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
8ef0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
8f00: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
8f10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 43 75  int i;.  int iCu
8f20: 72 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6d 50  r;.  for(i=0; mP
8f30: 72 65 72 65 71 3e 31 3b 20 69 2b 2b 2c 20 6d 50  rereq>1; i++, mP
8f40: 72 65 72 65 71 3e 3e 3d 31 29 7b 7d 0a 20 20 69  rereq>>=1){}.  i
8f50: 43 75 72 20 3d 20 70 46 72 6f 6d 2d 3e 61 5b 69  Cur = pFrom->a[i
8f60: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 66 6f 72  ].iCursor;.  for
8f70: 28 70 49 64 78 3d 70 46 72 6f 6d 2d 3e 61 5b 69  (pIdx=pFrom->a[i
8f80: 5d 2e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  ].pTab->pIndex; 
8f90: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
8fa0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
8fb0: 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 3d   pIdx->aColExpr=
8fc0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
8fd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
8fe0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  dx->nKeyCol; i++
8ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ){.      if( pId
9000: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 21 3d  x->aiColumn[i]!=
9010: 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69 6e  XN_EXPR ) contin
9020: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
9030: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
9040: 53 6b 69 70 28 70 45 78 70 72 2c 20 70 49 64 78  Skip(pExpr, pIdx
9050: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d  ->aColExpr->a[i]
9060: 2e 70 45 78 70 72 2c 20 69 43 75 72 29 3d 3d 30  .pExpr, iCur)==0
9070: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 75   ){.        aiCu
9080: 72 43 6f 6c 5b 30 5d 20 3d 20 69 43 75 72 3b 0a  rCol[0] = iCur;.
9090: 20 20 20 20 20 20 20 20 61 69 43 75 72 43 6f 6c          aiCurCol
90a0: 5b 31 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20  [1] = XN_EXPR;. 
90b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
90c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
90d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
90e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
90f0: 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64 28 0a  MightBeIndexed(.
9100: 20 20 53 72 63 4c 69 73 74 20 2a 70 46 72 6f 6d    SrcList *pFrom
9110: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
9120: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
9130: 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
9140: 2c 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61  ,       /* Bitma
9150: 73 6b 20 6f 66 20 46 52 4f 4d 20 63 6c 61 75 73  sk of FROM claus
9160: 65 20 74 65 72 6d 73 20 72 65 66 65 72 65 6e 63  e terms referenc
9170: 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 20  ed by pExpr */. 
9180: 20 69 6e 74 20 2a 61 69 43 75 72 43 6f 6c 2c 20   int *aiCurCol, 
9190: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
91a0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
91b0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 26 20 63  table cursor & c
91c0: 6f 6c 75 6d 6e 20 68 65 72 65 20 2a 2f 0a 20 20  olumn here */.  
91d0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
91e0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65         /* An ope
91f0: 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72  rand of a compar
9200: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
9210: 0a 20 20 69 6e 74 20 6f 70 20 20 20 20 20 20 20  .  int op       
9220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9230: 20 73 70 65 63 69 66 69 63 20 63 6f 6d 70 61 72   specific compar
9240: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
9250: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  .){.  /* If this
9260: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
9270: 20 76 65 63 74 6f 72 20 74 6f 20 74 68 65 20 6c   vector to the l
9280: 65 66 74 20 6f 72 20 72 69 67 68 74 20 6f 66 20  eft or right of 
9290: 61 20 0a 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69  a .  ** inequali
92a0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 3e  ty constraint (>
92b0: 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 2c 20  , <, >= or <=), 
92c0: 70 65 72 66 6f 72 6d 20 74 68 65 20 70 72 6f 63  perform the proc
92d0: 65 73 73 69 6e 67 20 0a 20 20 2a 2a 20 6f 6e 20  essing .  ** on 
92e0: 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
92f0: 74 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  t of the vector.
9300: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 54    */.  assert( T
9310: 4b 5f 47 54 2b 31 3d 3d 54 4b 5f 4c 45 20 26 26  K_GT+1==TK_LE &&
9320: 20 54 4b 5f 47 54 2b 32 3d 3d 54 4b 5f 4c 54 20   TK_GT+2==TK_LT 
9330: 26 26 20 54 4b 5f 47 54 2b 33 3d 3d 54 4b 5f 47  && TK_GT+3==TK_G
9340: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
9350: 4b 5f 49 53 3c 54 4b 5f 47 45 20 26 26 20 54 4b  K_IS<TK_GE && TK
9360: 5f 49 53 4e 55 4c 4c 3c 54 4b 5f 47 45 20 26 26  _ISNULL<TK_GE &&
9370: 20 54 4b 5f 49 4e 3c 54 4b 5f 47 45 20 29 3b 0a   TK_IN<TK_GE );.
9380: 20 20 61 73 73 65 72 74 28 20 6f 70 3c 3d 54 4b    assert( op<=TK
9390: 5f 47 45 20 29 3b 0a 20 20 69 66 28 20 70 45 78  _GE );.  if( pEx
93a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  pr->op==TK_VECTO
93b0: 52 20 26 26 20 28 6f 70 3e 3d 54 4b 5f 47 54 20  R && (op>=TK_GT 
93c0: 26 26 20 41 4c 57 41 59 53 28 6f 70 3c 3d 54 4b  && ALWAYS(op<=TK
93d0: 5f 47 45 29 29 20 29 7b 0a 20 20 20 20 70 45 78  _GE)) ){.    pEx
93e0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
93f0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
9400: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
9410: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
9420: 20 29 7b 0a 20 20 20 20 61 69 43 75 72 43 6f 6c   ){.    aiCurCol
9430: 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  [0] = pExpr->iTa
9440: 62 6c 65 3b 0a 20 20 20 20 61 69 43 75 72 43 6f  ble;.    aiCurCo
9450: 6c 5b 31 5d 20 3d 20 70 45 78 70 72 2d 3e 69 43  l[1] = pExpr->iC
9460: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 72 65 74 75 72  olumn;.    retur
9470: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  n 1;.  }.  if( m
9480: 50 72 65 72 65 71 3d 3d 30 20 29 20 72 65 74 75  Prereq==0 ) retu
9490: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
94a0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 74 61 62 6c        /* No tabl
94b0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  e references */.
94c0: 20 20 69 66 28 20 28 6d 50 72 65 72 65 71 26 28    if( (mPrereq&(
94d0: 6d 50 72 65 72 65 71 2d 31 29 29 21 3d 30 20 29  mPrereq-1))!=0 )
94e0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
94f0: 52 65 66 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  Refs more than o
9500: 6e 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 65  ne table */.  re
9510: 74 75 72 6e 20 65 78 70 72 4d 69 67 68 74 42 65  turn exprMightBe
9520: 49 6e 64 65 78 65 64 32 28 70 46 72 6f 6d 2c 6d  Indexed2(pFrom,m
9530: 50 72 65 72 65 71 2c 61 69 43 75 72 43 6f 6c 2c  Prereq,aiCurCol,
9540: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
9550: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
9560: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
9570: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
9580: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
9590: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
95a0: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
95b0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
95c0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
95d0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
95e0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
95f0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
9600: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
9610: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
9620: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
9630: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9640: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
9650: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
9660: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
9670: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
9680: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
9690: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a  X <op> <expr>"..
96a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
96b0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
96c0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
96d0: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
96e0: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75  nd Y are.** colu
96f0: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
9700: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
9710: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
9720: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
9730: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20  .** term of the 
9740: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20  form "Y <op> X" 
9750: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
9760: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
9770: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70  .** analyzed sep
9780: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72  arately.  The or
9790: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d  iginal term is m
97a0: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
97b0: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68  COPIED.** and th
97c0: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61  e new term is ma
97d0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44  rked with TERM_D
97e0: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20  YNAMIC (because 
97f0: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65  it's pExpr.** ne
9800: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
9810: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c  with the WhereCl
9820: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56  ause) and TERM_V
9830: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20  IRTUAL (because 
9840: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75  it.** is a commu
9850: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72  ted copy of a pr
9860: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20  ior term.)  The 
9870: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61  original term ha
9880: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e  s nChild=1.** an
9890: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69  d the copy has i
98a0: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20  dxParent set to 
98b0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
98c0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a   original term..
98d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
98e0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
98f0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
9900: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
9910: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
9920: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
9930: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
9940: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
9950: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9970: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
9980: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
9990: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
99a0: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43  fo *pWInfo = pWC
99b0: 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45  ->pWInfo; /* WHE
99c0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
99d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
99e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
99f0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
9a00: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
9a10: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
9a20: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
9a30: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
9a40: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
9a50: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
9a60: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
9a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9a90: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
9aa0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
9ab0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ad0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
9ae0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
9af0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
9b00: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
9b10: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
9b20: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
9b30: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
9b40: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
9b50: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
9b60: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
9b70: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
9b80: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
9bb0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
9bc0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
9bd0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
9be0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
9bf0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
9c00: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
9c10: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 2f 2a 20 75 70 70 65 72 63 61 73 65 20 65 71   /* uppercase eq
9c40: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
9c50: 72 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f  rcase */.  int o
9c60: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9c80: 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f  op-level operato
9c90: 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f  r.  pExpr->op */
9ca0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9cb0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
9cc0: 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63  e;  /* Parsing c
9cd0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
9ce0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9cf0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  ->db;        /* 
9d00: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
9d10: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ion */.  unsigne
9d20: 64 20 63 68 61 72 20 65 4f 70 32 20 3d 20 30 3b  d char eOp2 = 0;
9d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 32            /* op2
9d40: 20 76 61 6c 75 65 20 66 6f 72 20 4c 49 4b 45 2f   value for LIKE/
9d50: 52 45 47 45 58 50 2f 47 4c 4f 42 20 2a 2f 0a 20  REGEXP/GLOB */. 
9d60: 20 69 6e 74 20 6e 4c 65 66 74 3b 20 20 20 20 20   int nLeft;     
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
9d90: 6c 65 6d 65 6e 74 73 20 6f 6e 20 6c 65 66 74 20  lements on left 
9da0: 73 69 64 65 20 76 65 63 74 6f 72 20 2a 2f 0a 0a  side vector */..
9db0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
9dc0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
9dd0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72  turn;.  }.  pTer
9de0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
9df0: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74  erm];.  pMaskSet
9e00: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73   = &pWInfo->sMas
9e10: 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20  kSet;.  pExpr = 
9e20: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
9e30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
9e40: 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70  p!=TK_AS && pExp
9e50: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op!=TK_COLLAT
9e60: 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66  E );.  prereqLef
9e70: 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
9e80: 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b 53  ExprUsage(pMaskS
9e90: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
9ea0: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  );.  op = pExpr-
9eb0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
9ec0: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
9ed0: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
9ee0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
9ef0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
9f00: 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
9f10: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
9f20: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
9f30: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
9f40: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
9f50: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
9f60: 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63  ight = exprSelec
9f70: 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
9f80: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
9f90: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
9fa0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72       pTerm->prer
9fb0: 65 71 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  eqRight = sqlite
9fc0: 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
9fd0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9fe0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
9ff0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
a000: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
a010: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
a020: 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  reqRight = 0;.  
a030: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d  }else{.    pTerm
a040: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a050: 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72  sqlite3WhereExpr
a060: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a070: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
a080: 20 20 7d 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e    }.  pMaskSet->
a090: 62 56 61 72 53 65 6c 65 63 74 20 3d 20 30 3b 0a  bVarSelect = 0;.
a0a0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 73 71    prereqAll = sq
a0b0: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73  lite3WhereExprUs
a0c0: 61 67 65 4e 4e 28 70 4d 61 73 6b 53 65 74 2c 20  ageNN(pMaskSet, 
a0d0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 4d  pExpr);.  if( pM
a0e0: 61 73 6b 53 65 74 2d 3e 62 56 61 72 53 65 6c 65  askSet->bVarSele
a0f0: 63 74 20 29 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ct ) pTerm->wtFl
a100: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 56 41 52 53  ags |= TERM_VARS
a110: 45 4c 45 43 54 3b 0a 20 20 69 66 28 20 45 78 70  ELECT;.  if( Exp
a120: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
a130: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
a140: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
a150: 78 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  x = sqlite3Where
a160: 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  GetMask(pMaskSet
a170: 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  , pExpr->iRightJ
a180: 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  oinTable);.    p
a190: 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20  rereqAll |= x;. 
a1a0: 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20     extraRight = 
a1b0: 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75  x-1;  /* ON clau
a1c0: 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74  se terms may not
a1d0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
a1e0: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
a200: 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f   on left table o
a210: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
a220: 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a  Ticket #3015 */.
a230: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 41      if( (prereqA
a240: 6c 6c 3e 3e 31 29 3e 3d 78 20 29 7b 0a 20 20 20  ll>>1)>=x ){.   
a250: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a260: 73 67 28 70 50 61 72 73 65 2c 20 22 4f 4e 20 63  sg(pParse, "ON c
a270: 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 73  lause references
a280: 20 74 61 62 6c 65 73 20 74 6f 20 69 74 73 20 72   tables to its r
a290: 69 67 68 74 22 29 3b 0a 20 20 20 20 20 20 72 65  ight");.      re
a2a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
a2b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
a2c0: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
a2d0: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
a2e0: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
a2f0: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
a300: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
a310: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
a320: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a  llowedOp(op) ){.
a330: 20 20 20 20 69 6e 74 20 61 69 43 75 72 43 6f 6c      int aiCurCol
a340: 5b 32 5d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  [2];.    Expr *p
a350: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
a360: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
a370: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
a380: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
a390: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
a3a0: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52  ollate(pExpr->pR
a3b0: 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20 6f  ight);.    u16 o
a3c0: 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d 3e  pMask = (pTerm->
a3d0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72  prereqRight & pr
a3e0: 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20 57  ereqLeft)==0 ? W
a3f0: 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49 56  O_ALL : WO_EQUIV
a400: 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ;..    if( pTerm
a410: 2d 3e 69 46 69 65 6c 64 3e 30 20 29 7b 0a 20 20  ->iField>0 ){.  
a420: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
a430: 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 61  TK_IN );.      a
a440: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 6f 70  ssert( pLeft->op
a450: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 3b 0a 20  ==TK_VECTOR );. 
a460: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65       pLeft = pLe
a470: 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 70  ft->x.pList->a[p
a480: 54 65 72 6d 2d 3e 69 46 69 65 6c 64 2d 31 5d 2e  Term->iField-1].
a490: 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  pExpr;.    }..  
a4a0: 20 20 69 66 28 20 65 78 70 72 4d 69 67 68 74 42    if( exprMightB
a4b0: 65 49 6e 64 65 78 65 64 28 70 53 72 63 2c 20 70  eIndexed(pSrc, p
a4c0: 72 65 72 65 71 4c 65 66 74 2c 20 61 69 43 75 72  rereqLeft, aiCur
a4d0: 43 6f 6c 2c 20 70 4c 65 66 74 2c 20 6f 70 29 20  Col, pLeft, op) 
a4e0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
a4f0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 61 69 43  leftCursor = aiC
a500: 75 72 43 6f 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  urCol[0];.      
a510: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
a520: 75 6d 6e 20 3d 20 61 69 43 75 72 43 6f 6c 5b 31  umn = aiCurCol[1
a530: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
a540: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
a550: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
a560: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
a570: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29   if( op==TK_IS )
a580: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
a590: 7c 3d 20 54 45 52 4d 5f 49 53 3b 0a 20 20 20 20  |= TERM_IS;.    
a5a0: 69 66 28 20 70 52 69 67 68 74 20 0a 20 20 20 20  if( pRight .    
a5b0: 20 26 26 20 65 78 70 72 4d 69 67 68 74 42 65 49   && exprMightBeI
a5c0: 6e 64 65 78 65 64 28 70 53 72 63 2c 20 70 54 65  ndexed(pSrc, pTe
a5d0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 2c  rm->prereqRight,
a5e0: 20 61 69 43 75 72 43 6f 6c 2c 20 70 52 69 67 68   aiCurCol, pRigh
a5f0: 74 2c 20 6f 70 29 0a 20 20 20 20 29 7b 0a 20 20  t, op).    ){.  
a600: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
a610: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
a620: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36  *pDup;.      u16
a630: 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20   eExtraOp = 0;  
a640: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
a650: 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f  its for pNew->eO
a660: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
a670: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
a680: 69 46 69 65 6c 64 3d 3d 30 20 29 3b 0a 20 20 20  iField==0 );.   
a690: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a6a0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
a6b0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a6c0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
a6d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a6e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
a6f0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
a700: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a710: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a720: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a730: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
a740: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a750: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
a760: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
a770: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
a780: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
a790: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
a7a0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
a7b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a7c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
a7d0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
a7e0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
a7f0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
a800: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
a810: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49      if( op==TK_I
a820: 53 20 29 20 70 4e 65 77 2d 3e 77 74 46 6c 61 67  S ) pNew->wtFlag
a830: 73 20 7c 3d 20 54 45 52 4d 5f 49 53 3b 0a 20 20  s |= TERM_IS;.  
a840: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
a850: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a860: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77          pTerm->w
a870: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
a880: 4f 50 49 45 44 3b 0a 0a 20 20 20 20 20 20 20 20  OPIED;..        
a890: 69 66 28 20 74 65 72 6d 49 73 45 71 75 69 76 61  if( termIsEquiva
a8a0: 6c 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 44  lence(pParse, pD
a8b0: 75 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  up) ){.         
a8c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a8d0: 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  r |= WO_EQUIV;. 
a8e0: 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f           eExtraO
a8f0: 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  p = WO_EQUIV;.  
a900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
a910: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75  lse{.        pDu
a920: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  p = pExpr;.     
a930: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b     pNew = pTerm;
a940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
a950: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73  xprCommute(pPars
a960: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  e, pDup);.      
a970: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
a980: 20 3d 20 61 69 43 75 72 43 6f 6c 5b 30 5d 3b 0a   = aiCurCol[0];.
a990: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65        pNew->u.le
a9a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 61 69 43 75 72  ftColumn = aiCur
a9b0: 43 6f 6c 5b 31 5d 3b 0a 20 20 20 20 20 20 74 65  Col[1];.      te
a9c0: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
a9d0: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
a9e0: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
a9f0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
aa00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
aa10: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
aa20: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
aa30: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
aa40: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
aa50: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
aa60: 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70   (operatorMask(p
aa70: 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72  Dup->op) + eExtr
aa80: 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20  aOp) & opMask;. 
aa90: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
aaa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
aab0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
aac0: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
aad0: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
aae0: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
aaf0: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
ab00: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
ab10: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
ab20: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
ab30: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20  EEN implements. 
ab40: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
ab50: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42  **.  **      a B
ab60: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20  ETWEEN b AND c. 
ab70: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
ab80: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  erted into:.  **
ab90: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45  .  **      (a BE
aba0: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41  TWEEN b AND c) A
abb0: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61  ND (a>=b) AND (a
abc0: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <=c).  **.  ** T
abd0: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73  he two new terms
abe0: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20   are added onto 
abf0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
ac00: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
ac10: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  t..  ** The new 
ac20: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d  terms are "dynam
ac30: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c  ic" and are chil
ac40: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67  dren of the orig
ac50: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a  inal BETWEEN.  *
ac60: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65  * term.  That me
ac70: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20  ans that if the 
ac80: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
ac90: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64  coded, the child
aca0: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69  ren are.  ** ski
acb0: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68  pped.  Or, if th
acc0: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73  e children are s
acd0: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69  atisfied by an i
ace0: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e  ndex, the origin
acf0: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20  al.  ** BETWEEN 
ad00: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e  term is skipped.
ad10: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
ad20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
ad30: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f  ETWEEN && pWC->o
ad40: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
ad50: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
ad60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
ad70: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
ad80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
ad90: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
ada0: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
adb0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
adc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
add0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
ade0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
adf0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
ae00: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
ae10: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
ae20: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
ae30: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
ae40: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a  Parse, ops[i], .
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ae70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ae80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
ae90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
aeb0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
aec0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
aed0: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  xpr, 0));.      
aee0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
aef0: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70  ings(pNewExpr, p
af00: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78  Expr);.      idx
af10: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
af20: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
af30: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
af40: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
af50: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
af60: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
af70: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
af80: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
af90: 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72  New);.      pTer
afa0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
afb0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 6d 61 72 6b  erm];.      mark
afc0: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c  TermAsChild(pWC,
afd0: 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d   idxNew, idxTerm
afe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
aff0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b000: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
b010: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
b020: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b030: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
b040: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
b050: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
b060: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61  BQUERY).  /* Ana
b070: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
b080: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20   is composed of 
b090: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
b0a0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
b0b0: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65  y.  ** an OR ope
b0c0: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c  rator..  */.  el
b0d0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
b0e0: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61  ==TK_OR ){.    a
b0f0: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d  ssert( pWC->op==
b100: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78  TK_AND );.    ex
b110: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
b120: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65  pSrc, pWC, idxTe
b130: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
b140: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b150: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ];.  }.#endif /*
b160: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
b170: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
b180: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b190: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
b1a0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
b1b0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
b1c0: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
b1d0: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
b1e0: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
b1f0: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
b200: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
b210: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
b220: 4c 49 4b 45 20 27 61 42 63 25 27 22 20 69 73 20  LIKE 'aBc%'" is 
b230: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
b240: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
b250: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
b260: 41 42 43 27 20 41 4e 44 20 78 3c 27 61 62 64 27  ABC' AND x<'abd'
b270: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 42 63   AND x LIKE 'aBc
b280: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
b290: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
b2a0: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
b2b0: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
b2c0: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
b2d0: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
b2e0: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
b2f0: 20 20 49 66 20 63 61 73 65 20 69 73 20 6e 6f 74    If case is not
b300: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 28 74 68   significant (th
b310: 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 66  e default.  ** f
b320: 6f 72 20 4c 49 4b 45 29 20 74 68 65 6e 20 74 68  or LIKE) then th
b330: 65 20 6c 6f 77 65 72 2d 62 6f 75 6e 64 20 69 73  e lower-bound is
b340: 20 6d 61 64 65 20 61 6c 6c 20 75 70 70 65 72 63   made all upperc
b350: 61 73 65 20 61 6e 64 20 74 68 65 20 75 70 70 65  ase and the uppe
b360: 72 2d 0a 20 20 2a 2a 20 62 6f 75 6e 64 20 69 73  r-.  ** bound is
b370: 20 6d 61 64 65 20 61 6c 6c 20 6c 6f 77 65 72 63   made all lowerc
b380: 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ase so that the 
b390: 62 6f 75 6e 64 73 20 61 6c 73 6f 20 77 6f 72 6b  bounds also work
b3a0: 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 0a   when comparing.
b3b0: 20 20 2a 2a 20 42 4c 4f 42 73 2e 0a 20 20 2a 2f    ** BLOBs..  */
b3c0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
b3d0: 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
b3e0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
b3f0: 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
b400: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
b410: 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
b420: 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
b430: 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
b440: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
b450: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
b460: 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
b470: 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
b480: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
b490: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
b4a0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
b4b0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b4c0: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
b4d0: 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
b4e0: 78 4e 65 77 32 3b 0a 20 20 20 20 63 6f 6e 73 74  xNew2;.    const
b4f0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 53 65 71 4e   char *zCollSeqN
b500: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
b510: 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65   of collating se
b520: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 63 6f  quence */.    co
b530: 6e 73 74 20 75 31 36 20 77 74 46 6c 61 67 73 20  nst u16 wtFlags 
b540: 3d 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 7c  = TERM_LIKEOPT |
b550: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 7c 20   TERM_VIRTUAL | 
b560: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 3b 0a 0a 20  TERM_DYNAMIC;.. 
b570: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
b580: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b590: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b5a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b5b0: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b5c0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
b5d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
b5e0: 20 74 6f 20 75 70 70 65 72 2d 63 61 73 65 20 61   to upper-case a
b5f0: 6e 64 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  nd the upper bou
b600: 6e 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6c 6f 77  nd to.    ** low
b610: 65 72 2d 63 61 73 65 20 28 75 70 70 65 72 2d 63  er-case (upper-c
b620: 61 73 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ase is less than
b630: 20 6c 6f 77 65 72 2d 63 61 73 65 20 69 6e 20 41   lower-case in A
b640: 53 43 49 49 29 20 73 6f 20 74 68 61 74 0a 20 20  SCII) so that.  
b650: 20 20 2a 2a 20 74 68 65 20 72 61 6e 67 65 20 63    ** the range c
b660: 6f 6e 73 74 72 61 69 6e 74 73 20 61 6c 73 6f 20  onstraints also 
b670: 77 6f 72 6b 20 66 6f 72 20 42 4c 4f 42 73 0a 20  work for BLOBs. 
b680: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f     */.    if( no
b690: 43 61 73 65 20 26 26 20 21 70 50 61 72 73 65 2d  Case && !pParse-
b6a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
b6b0: 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  d ){.      int i
b6c0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a  ;.      char c;.
b6d0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
b6e0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b  lags |= TERM_LIK
b6f0: 45 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  E;.      for(i=0
b700: 3b 20 28 63 20 3d 20 70 53 74 72 31 2d 3e 75 2e  ; (c = pStr1->u.
b710: 7a 54 6f 6b 65 6e 5b 69 5d 29 21 3d 30 3b 20 69  zToken[i])!=0; i
b720: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 74  ++){.        pSt
b730: 72 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20  r1->u.zToken[i] 
b740: 3d 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72  = sqlite3Toupper
b750: 28 63 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74  (c);.        pSt
b760: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20  r2->u.zToken[i] 
b770: 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72  = sqlite3Tolower
b780: 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (c);.      }.   
b790: 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 64 62 2d   }..    if( !db-
b7a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b7b0: 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43  .      u8 c, *pC
b7c0: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  ;       /* Last 
b7d0: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
b7e0: 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63   the first wildc
b7f0: 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20  ard */.      pC 
b800: 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75  = (u8*)&pStr2->u
b810: 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53  .zToken[sqlite3S
b820: 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75  trlen30(pStr2->u
b830: 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20  .zToken)-1];.   
b840: 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20     c = *pC;.    
b850: 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a    if( noCase ){.
b860: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
b870: 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65  oint is to incre
b880: 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68  ment the last ch
b890: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
b8a0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
b8b0: 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42   ** wildcard.  B
b8c0: 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65  ut if we increme
b8d0: 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c  nt '@', that wil
b8e0: 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74  l push it into t
b8f0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
b900: 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77  phabetic range w
b910: 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72  here case conver
b920: 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20  sions will mess 
b930: 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  up the .        
b940: 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  ** inequality.  
b950: 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d  To avoid this, m
b960: 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f  ake sure to also
b970: 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20   run the full.  
b980: 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e        ** LIKE on
b990: 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65   all candidate e
b9a0: 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c  xpressions by cl
b9b0: 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d  earing the isCom
b9c0: 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20  plete flag.     
b9d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
b9e0: 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43  ( c=='A'-1 ) isC
b9f0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
ba00: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
ba10: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
ba20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
ba30: 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
ba40: 7d 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 4e 61  }.    zCollSeqNa
ba50: 6d 65 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e  me = noCase ? "N
ba60: 4f 43 41 53 45 22 20 3a 20 73 71 6c 69 74 65 33  OCASE" : sqlite3
ba70: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 70  StrBINARY;.    p
ba80: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
ba90: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
baa0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65  eft, 0);.    pNe
bab0: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
bac0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
bad0: 5f 47 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _GE,.           
bae0: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
baf0: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
bb00: 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 7a 43 6f  se,pNewExpr1,zCo
bb10: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20  llSeqName),.    
bb20: 20 20 20 20 20 20 20 70 53 74 72 31 29 3b 0a 20         pStr1);. 
bb30: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
bb40: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
bb50: 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  1, pExpr);.    i
bb60: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
bb70: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
bb80: 70 4e 65 77 45 78 70 72 31 2c 20 77 74 46 6c 61  pNewExpr1, wtFla
bb90: 67 73 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  gs);.    testcas
bba0: 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
bbb0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
bbc0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
bbd0: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
bbe0: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
bbf0: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
bc00: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
bc10: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
bc20: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
bc30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bc40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
bc50: 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 70 4e  String(pParse,pN
bc60: 65 77 45 78 70 72 32 2c 7a 43 6f 6c 6c 53 65 71  ewExpr2,zCollSeq
bc70: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
bc80: 20 20 70 53 74 72 32 29 3b 0a 20 20 20 20 74 72    pStr2);.    tr
bc90: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
bca0: 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45  gs(pNewExpr2, pE
bcb0: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  xpr);.    idxNew
bcc0: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
bcd0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
bce0: 78 70 72 32 2c 20 77 74 46 6c 61 67 73 29 3b 0a  xpr2, wtFlags);.
bcf0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
bd00: 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew2==0 );.    
bd10: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
bd20: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b  , pWC, idxNew2);
bd30: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
bd40: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
bd50: 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74     if( isComplet
bd60: 65 20 29 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54  e ){.      markT
bd70: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
bd80: 69 64 78 4e 65 77 31 2c 20 69 64 78 54 65 72 6d  idxNew1, idxTerm
bd90: 29 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72  );.      markTer
bda0: 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64  mAsChild(pWC, id
bdb0: 78 4e 65 77 32 2c 20 69 64 78 54 65 72 6d 29 3b  xNew2, idxTerm);
bdc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bdd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
bde0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
bdf0: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
be00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
be10: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
be20: 20 61 20 57 4f 5f 41 55 58 20 61 75 78 69 6c 69   a WO_AUX auxili
be30: 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20  ary term to the 
be40: 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69  constraint set i
be50: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
be60: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  nt expression is
be70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f   of the form "co
be80: 6c 75 6d 6e 20 4f 50 20 65 78 70 72 22 20 77 68  lumn OP expr" wh
be90: 65 72 65 20 4f 50 0a 20 20 2a 2a 20 69 73 20 61  ere OP.  ** is a
bea0: 6e 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 20  n operator that 
beb0: 67 65 74 73 20 70 61 73 73 65 64 20 69 6e 74 6f  gets passed into
bec0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
bed0: 62 75 74 20 77 68 69 63 68 20 69 73 0a 20 20 2a  but which is.  *
bee0: 2a 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 6f  * not normally o
bef0: 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 6f 72 64  ptimized for ord
bf00: 69 6e 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49  inary tables.  I
bf10: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 4f  n other words, O
bf20: 50 0a 20 20 2a 2a 20 69 73 20 6f 6e 65 20 6f 66  P.  ** is one of
bf30: 20 4d 41 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c   MATCH, LIKE, GL
bf40: 4f 42 2c 20 52 45 47 45 58 50 2c 20 21 3d 2c 20  OB, REGEXP, !=, 
bf50: 49 53 2c 20 49 53 20 4e 4f 54 2c 20 6f 72 20 4e  IS, IS NOT, or N
bf60: 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 54 68  OT NULL..  ** Th
bf70: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
bf80: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
bf90: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
bfa0: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
bfb0: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
bfc0: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
bfd0: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
bfe0: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
bff0: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
c000: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
c010: 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e    */.  if( pWC->
c020: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
c030: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
c040: 20 30 2c 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a   0, *pLeft = 0;.
c050: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 69 73      int res = is
c060: 41 75 78 69 6c 69 61 72 79 56 74 61 62 4f 70 65  AuxiliaryVtabOpe
c070: 72 61 74 6f 72 28 64 62 2c 20 70 45 78 70 72 2c  rator(db, pExpr,
c080: 20 26 65 4f 70 32 2c 20 26 70 4c 65 66 74 2c 20   &eOp2, &pLeft, 
c090: 26 70 52 69 67 68 74 29 3b 0a 20 20 20 20 77 68  &pRight);.    wh
c0a0: 69 6c 65 28 20 72 65 73 2d 2d 20 3e 20 30 20 29  ile( res-- > 0 )
c0b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  {.      int idxN
c0c0: 65 77 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  ew;.      WhereT
c0d0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
c0e0: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65       Bitmask pre
c0f0: 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65  reqColumn, prere
c100: 71 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 70 72  qExpr;..      pr
c110: 65 72 65 71 45 78 70 72 20 3d 20 73 71 6c 69 74  ereqExpr = sqlit
c120: 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65  e3WhereExprUsage
c130: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
c140: 74 29 3b 0a 20 20 20 20 20 20 70 72 65 72 65 71  t);.      prereq
c150: 43 6f 6c 75 6d 6e 20 3d 20 73 71 6c 69 74 65 33  Column = sqlite3
c160: 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70  WhereExprUsage(p
c170: 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b  MaskSet, pLeft);
c180: 0a 20 20 20 20 20 20 69 66 28 20 28 70 72 65 72  .      if( (prer
c190: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
c1a0: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
c1b0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
c1c0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
c1d0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
c1e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c1f0: 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20  MATCH, .        
c200: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
c210: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
c220: 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 69  , 0));.        i
c230: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
c240: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
c250: 6d 4a 6f 69 6e 29 20 26 26 20 70 4e 65 77 45 78  mJoin) && pNewEx
c260: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
c270: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
c280: 70 4e 65 77 45 78 70 72 2c 20 45 50 5f 46 72 6f  pNewExpr, EP_Fro
c290: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  mJoin);.        
c2a0: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
c2b0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c2c0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
c2d0: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
c2e0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
c2f0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
c300: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
c310: 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20         pNewTerm 
c320: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
c330: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 54  ];.        pNewT
c340: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
c350: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
c360: 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d         pNewTerm-
c370: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c380: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c390: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
c3a0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
c3b0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
c3c0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c3d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41  eOperator = WO_A
c3e0: 55 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  UX;.        pNew
c3f0: 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 20 3d  Term->eMatchOp =
c400: 20 65 4f 70 32 3b 0a 20 20 20 20 20 20 20 20 6d   eOp2;.        m
c410: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70  arkTermAsChild(p
c420: 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54  WC, idxNew, idxT
c430: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 54  erm);.        pT
c440: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c450: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
c460: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
c470: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
c480: 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d         pNewTerm-
c490: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
c4a0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
c4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 53 57 41       }.      SWA
c4c0: 50 28 45 78 70 72 2a 2c 20 70 4c 65 66 74 2c 20  P(Expr*, pLeft, 
c4d0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
c4e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
c4f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
c500: 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 49  TABLE */..  /* I
c510: 66 20 74 68 65 72 65 20 69 73 20 61 20 76 65 63  f there is a vec
c520: 74 6f 72 20 3d 3d 20 6f 72 20 49 53 20 74 65 72  tor == or IS ter
c530: 6d 20 2d 20 65 2e 67 2e 20 22 28 61 2c 20 62 29  m - e.g. "(a, b)
c540: 20 3d 3d 20 28 3f 2c 20 3f 29 22 20 2d 20 63 72   == (?, ?)" - cr
c550: 65 61 74 65 0a 20 20 2a 2a 20 6e 65 77 20 74 65  eate.  ** new te
c560: 72 6d 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6d  rms for each com
c570: 70 6f 6e 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f  ponent compariso
c580: 6e 20 2d 20 22 61 20 3d 20 3f 22 20 61 6e 64 20  n - "a = ?" and 
c590: 22 62 20 3d 20 3f 22 2e 20 20 54 68 65 0a 20 20  "b = ?".  The.  
c5a0: 2a 2a 20 6e 65 77 20 74 65 72 6d 73 20 63 6f 6d  ** new terms com
c5b0: 70 6c 65 74 65 6c 79 20 72 65 70 6c 61 63 65 20  pletely replace 
c5c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 65 63  the original vec
c5d0: 74 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  tor comparison, 
c5e0: 77 68 69 63 68 20 69 73 0a 20 20 2a 2a 20 6e 6f  which is.  ** no
c5f0: 20 6c 6f 6e 67 65 72 20 75 73 65 64 2e 0a 20 20   longer used..  
c600: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
c610: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66  only required if
c620: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73 69   at least one si
c630: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
c640: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 20  ison operation. 
c650: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 75 62   ** is not a sub
c660: 2d 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69  -select.  */.  i
c670: 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  f( pWC->op==TK_A
c680: 4e 44 20 0a 20 20 26 26 20 28 70 45 78 70 72 2d  ND .  && (pExpr-
c690: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45  >op==TK_EQ || pE
c6a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 0a  xpr->op==TK_IS).
c6b0: 20 20 26 26 20 28 6e 4c 65 66 74 20 3d 20 73 71    && (nLeft = sq
c6c0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
c6d0: 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
c6e0: 29 29 3e 31 0a 20 20 26 26 20 73 71 6c 69 74 65  ))>1.  && sqlite
c6f0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
c700: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3d 3d  pExpr->pRight)==
c710: 6e 4c 65 66 74 0a 20 20 26 26 20 28 20 28 70 45  nLeft.  && ( (pE
c720: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
c730: 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
c740: 29 3d 3d 30 20 0a 20 20 20 20 7c 7c 20 28 70 45  )==0 .    || (pE
c750: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
c760: 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
c770: 74 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  t)==0).  ){.    
c780: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
c790: 3d 30 3b 20 69 3c 6e 4c 65 66 74 3b 20 69 2b 2b  =0; i<nLeft; i++
c7a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  ){.      int idx
c7b0: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
c7c0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
c7d0: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
c7e0: 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46  e3ExprForVectorF
c7f0: 69 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78  ield(pParse, pEx
c800: 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pr->pLeft, i);. 
c810: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
c820: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  t = sqlite3ExprF
c830: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50  orVectorField(pP
c840: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
c850: 67 68 74 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20  ght, i);..      
c860: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45  pNew = sqlite3PE
c870: 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
c880: 72 2d 3e 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52  r->op, pLeft, pR
c890: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 72 61  ight);.      tra
c8a0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
c8b0: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  s(pNew, pExpr);.
c8c0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
c8d0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
c8e0: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
c8f0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
c900: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
c910: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
c920: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d  .    }.    pTerm
c930: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c940: 72 6d 5d 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  rm];.    pTerm->
c950: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c960: 43 4f 44 45 44 7c 54 45 52 4d 5f 56 49 52 54 55  CODED|TERM_VIRTU
c970: 41 4c 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20  AL;  /* Disable 
c980: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a  the original */.
c990: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
c9a0: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ator = 0;.  }.. 
c9b0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
c9c0: 61 20 76 65 63 74 6f 72 20 49 4e 20 74 65 72 6d  a vector IN term
c9d0: 20 2d 20 65 2e 67 2e 20 22 28 61 2c 20 62 29 20   - e.g. "(a, b) 
c9e0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
c9f0: 20 2d 20 63 72 65 61 74 65 0a 20 20 2a 2a 20 61   - create.  ** a
ca00: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 66 6f   virtual term fo
ca10: 72 20 65 61 63 68 20 76 65 63 74 6f 72 20 63 6f  r each vector co
ca20: 6d 70 6f 6e 65 6e 74 2e 20 54 68 65 20 65 78 70  mponent. The exp
ca30: 72 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 0a 20  ression object. 
ca40: 20 2a 2a 20 75 73 65 64 20 62 79 20 65 61 63 68   ** used by each
ca50: 20 73 75 63 68 20 76 69 72 74 75 61 6c 20 74 65   such virtual te
ca60: 72 6d 20 69 73 20 70 45 78 70 72 20 28 74 68 65  rm is pExpr (the
ca70: 20 66 75 6c 6c 20 76 65 63 74 6f 72 20 49 4e 28   full vector IN(
ca80: 2e 2e 2e 29 20 0a 20 20 2a 2a 20 65 78 70 72 65  ...) .  ** expre
ca90: 73 73 69 6f 6e 29 2e 20 54 68 65 20 57 68 65 72  ssion). The Wher
caa0: 65 54 65 72 6d 2e 69 46 69 65 6c 64 20 76 61 72  eTerm.iField var
cab0: 69 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 73  iable identifies
cac0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 69   the index withi
cad0: 6e 0a 20 20 2a 2a 20 74 68 65 20 76 65 63 74 6f  n.  ** the vecto
cae0: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 74 68 61  r on the LHS tha
caf0: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
cb00: 72 6d 20 72 65 70 72 65 73 65 6e 74 73 2e 0a 20  rm represents.. 
cb10: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6f 6e   **.  ** This on
cb20: 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
cb30: 52 48 53 20 69 73 20 61 20 73 69 6d 70 6c 65 20  RHS is a simple 
cb40: 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 63 6f  SELECT, not a co
cb50: 6d 70 6f 75 6e 64 0a 20 20 2a 2f 0a 20 20 69 66  mpound.  */.  if
cb60: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
cb70: 44 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  D && pExpr->op==
cb80: 54 4b 5f 49 4e 20 26 26 20 70 54 65 72 6d 2d 3e  TK_IN && pTerm->
cb90: 69 46 69 65 6c 64 3d 3d 30 0a 20 20 20 26 26 20  iField==0.   && 
cba0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
cbb0: 3d 3d 54 4b 5f 56 45 43 54 4f 52 0a 20 20 20 26  ==TK_VECTOR.   &
cbc0: 26 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  & pExpr->x.pSele
cbd0: 63 74 2d 3e 70 50 72 69 6f 72 3d 3d 30 0a 20 20  ct->pPrior==0.  
cbe0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
cbf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c    for(i=0; i<sql
cc00: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
cc10: 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ze(pExpr->pLeft)
cc20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
cc30: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
cc40: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
cc50: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
cc60: 70 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  pExpr, TERM_VIRT
cc70: 55 41 4c 29 3b 0a 20 20 20 20 20 20 70 57 43 2d  UAL);.      pWC-
cc80: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 46 69 65 6c  >a[idxNew].iFiel
cc90: 64 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 65  d = i+1;.      e
cca0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
ccb0: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
ccc0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
ccd0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
cce0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
ccf0: 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
cd00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
cd10: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20  3_OR_STAT4.  /* 
cd20: 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  When sqlite_stat
cd30: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
cd40: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e   is available an
cd50: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65   operator of the
cd60: 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53  .  ** form "x IS
cd70: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73   NOT NULL" can s
cd80: 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c  ometimes be eval
cd90: 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63  uated more effic
cda0: 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22  iently.  ** as "
cdb0: 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20  x>NULL" if x is 
cdc0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
cdd0: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20  RIMARY KEY.  So 
cde0: 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a  construct a.  **
cdf0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66   virtual term of
ce00: 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a   that form..  **
ce10: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
ce20: 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  the virtual term
ce30: 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20   must be tagged 
ce40: 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e  with TERM_VNULL.
ce50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
ce60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
ce70: 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70  L.   && pExpr->p
ce80: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Left->op==TK_COL
ce90: 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d  UMN.   && pExpr-
cea0: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e  >pLeft->iColumn>
ceb0: 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
cec0: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
ced0: 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a   SQLITE_Stat34).
cee0: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
cef0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70  NewExpr;.    Exp
cf00: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
cf10: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  ->pLeft;.    int
cf20: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65   idxNew;.    Whe
cf30: 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d  reTerm *pNewTerm
cf40: 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20  ;..    pNewExpr 
cf50: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
cf60: 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20  Parse, TK_GT,.  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cf90: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
cfa0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
cfd0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 4e 55 4c 4c  lloc(db, TK_NULL
cfe0: 2c 20 30 2c 20 30 29 29 3b 0a 0a 20 20 20 20 69  , 0, 0));..    i
cff0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
d000: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
d010: 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20  NewExpr,.       
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54         TERM_VIRT
d040: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
d050: 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20  |TERM_VNULL);.  
d060: 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a    if( idxNew ){.
d070: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
d080: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
d090: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
d0a0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
d0b0: 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  0;.      pNewTer
d0c0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
d0d0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
d0e0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
d0f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
d100: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
d110: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
d120: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b  perator = WO_GT;
d130: 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41  .      markTermA
d140: 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e  sChild(pWC, idxN
d150: 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  ew, idxTerm);.  
d160: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
d170: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
d180: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
d190: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
d1a0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
d1b0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
d1c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
d1d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
d1e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
d1f0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
d200: 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  4 */..  /* Preve
d210: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
d220: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
d230: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
d240: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
d250: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
d260: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
d270: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
d280: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
d290: 65 72 6d 21 3d 26 70 57 43 2d 3e 61 5b 69 64 78  erm!=&pWC->a[idx
d2a0: 54 65 72 6d 5d 20 29 3b 0a 20 20 70 54 65 72 6d  Term] );.  pTerm
d2b0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
d2c0: 72 6d 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 72  rm];.  pTerm->pr
d2d0: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
d2e0: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 2a 2a  raRight;.}../***
d2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d330: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 52 6f 75 74  ********.** Rout
d340: 69 6e 65 73 20 77 69 74 68 20 66 69 6c 65 20 73  ines with file s
d350: 63 6f 70 65 20 61 62 6f 76 65 2e 20 20 49 6e 74  cope above.  Int
d360: 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 72 65  erface to the re
d370: 73 74 20 6f 66 20 74 68 65 20 77 68 65 72 65 2e  st of the where.
d380: 63 0a 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 66  c.** subsystem f
d390: 6f 6c 6c 6f 77 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  ollows..********
d3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3e0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
d3f0: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66   routine identif
d400: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  ies subexpressio
d410: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
d420: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20  clause where.** 
d430: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
d440: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
d450: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
d460: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  tor or some othe
d470: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70  r.** operator sp
d480: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f  ecified in the o
d490: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  p parameter.  Th
d4a0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
d4b0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69  ructure.** is fi
d4c0: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65  lled with pointe
d4d0: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73  rs to subexpress
d4e0: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ions.  For examp
d4f0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45  le:.**.**    WHE
d500: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41  RE  a=='hello' A
d510: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31  ND coalesce(b,11
d520: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d  )<10 AND (c+12!=
d530: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20  d OR c==22).**  
d540: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
d550: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
d560: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
d570: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
d580: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73  .**            s
d590: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20  lot[0]          
d5a0: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20    slot[1]       
d5b0: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a          slot[2].
d5c0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
d5d0: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
d5e0: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c  in pExpr is unal
d5f0: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73  tered.  All this
d600: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
d610: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20   is make slot[] 
d620: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f  entries point to
d630: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69   substructure wi
d640: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a  thin pExpr..**.*
d650: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75  * In the previou
d660: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69  s sentence and i
d670: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22  n the diagram, "
d680: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74  slot[]" refers t
d690: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c  o.** the WhereCl
d6a0: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20  ause.a[] array. 
d6b0: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61   The slot[] arra
d6c0: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
d6d0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
d6e0: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
d6f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
d700: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
d710: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
d720: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
d730: 2a 70 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a  *pExpr, u8 op){.
d740: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 73 71    Expr *pE2 = sq
d750: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
d760: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 70  late(pExpr);.  p
d770: 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69  WC->op = op;.  i
d780: 66 28 20 70 45 32 3d 3d 30 20 29 20 72 65 74 75  f( pE2==0 ) retu
d790: 72 6e 3b 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f  rn;.  if( pE2->o
d7a0: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
d7b0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
d7c0: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
d7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
d7e0: 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 70 57  te3WhereSplit(pW
d7f0: 43 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 6f  C, pE2->pLeft, o
d800: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  p);.    sqlite3W
d810: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
d820: 45 32 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b  E2->pRight, op);
d830: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
d840: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c  itialize a preal
d850: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61  located WhereCla
d860: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  use structure..*
d870: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
d880: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20  ereClauseInit(. 
d890: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
d8a0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  C,        /* The
d8b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20   WhereClause to 
d8c0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
d8d0: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
d8e0: 57 49 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a 20  WInfo        /* 
d8f0: 54 68 65 20 57 48 45 52 45 20 70 72 6f 63 65 73  The WHERE proces
d900: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d910: 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f  ){.  pWC->pWInfo
d920: 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43   = pWInfo;.  pWC
d930: 2d 3e 68 61 73 4f 72 20 3d 20 30 3b 0a 20 20 70  ->hasOr = 0;.  p
d940: 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a  WC->pOuter = 0;.
d950: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30    pWC->nTerm = 0
d960: 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d  ;.  pWC->nSlot =
d970: 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e   ArraySize(pWC->
d980: 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d  aStatic);.  pWC-
d990: 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69  >a = pWC->aStati
d9a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  c;.}../*.** Deal
d9b0: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
d9c0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
d9d0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
d9e0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
d9f0: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
da00: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
da10: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
da20: 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  of.** sqlite3Whe
da30: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a  reClauseInit()..
da40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
da50: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
da60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
da70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
da80: 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71  ereTerm *a;.  sq
da90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d  lite3 *db = pWC-
daa0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  >pWInfo->pParse-
dab0: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  >db;.  for(i=pWC
dac0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
dad0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
dae0: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
daf0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
db00: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
db10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
db20: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29  te(db, a->pExpr)
db30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
db40: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
db50: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20  M_ORINFO ){.    
db60: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c    whereOrInfoDel
db70: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72  ete(db, a->u.pOr
db80: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Info);.    }else
db90: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
dba0: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29  & TERM_ANDINFO )
dbb0: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64  {.      whereAnd
dbc0: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
dbd0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20  ->u.pAndInfo);. 
dbe0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
dbf0: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
dc00: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
dc10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43  e3DbFree(db, pWC
dc20: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  ->a);.  }.}.../*
dc30: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
dc40: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69  es walk (recursi
dc50: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73  vely) an express
dc60: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e  ion tree and gen
dc70: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61  erate.** a bitma
dc80: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
dc90: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
dca0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
dcb0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
dcc0: 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74  */.Bitmask sqlit
dcd0: 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65  e3WhereExprUsage
dce0: 4e 4e 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  NN(WhereMaskSet 
dcf0: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20  *pMaskSet, Expr 
dd00: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  *p){.  Bitmask m
dd10: 61 73 6b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  ask;.  if( p->op
dd20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 21  ==TK_COLUMN && !
dd30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
dd40: 70 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  p, EP_FixedCol) 
dd50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
dd60: 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
dd70: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  k(pMaskSet, p->i
dd80: 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 20  Table);.  }else 
dd90: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
dda0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
ddb0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
ddc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
ddd0: 70 21 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p!=TK_IF_NULL_RO
dde0: 57 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  W );.    return 
ddf0: 30 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20  0;.  }.  mask = 
de00: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  (p->op==TK_IF_NU
de10: 4c 4c 5f 52 4f 57 29 20 3f 20 73 71 6c 69 74 65  LL_ROW) ? sqlite
de20: 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d  3WhereGetMask(pM
de30: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c  askSet, p->iTabl
de40: 65 29 20 3a 20 30 3b 0a 20 20 69 66 28 20 70 2d  e) : 0;.  if( p-
de50: 3e 70 4c 65 66 74 20 29 20 6d 61 73 6b 20 7c 3d  >pLeft ) mask |=
de60: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
de70: 72 55 73 61 67 65 4e 4e 28 70 4d 61 73 6b 53 65  rUsageNN(pMaskSe
de80: 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t, p->pLeft);.  
de90: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
dea0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c  .    mask |= sql
deb0: 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61  ite3WhereExprUsa
dec0: 67 65 4e 4e 28 70 4d 61 73 6b 53 65 74 2c 20 70  geNN(pMaskSet, p
ded0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 61  ->pRight);.    a
dee0: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73  ssert( p->x.pLis
def0: 74 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20  t==0 );.  }else 
df00: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
df10: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
df20: 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
df30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
df40: 70 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  p, EP_VarSelect)
df50: 20 29 20 70 4d 61 73 6b 53 65 74 2d 3e 62 56 61   ) pMaskSet->bVa
df60: 72 53 65 6c 65 63 74 20 3d 20 31 3b 0a 20 20 20  rSelect = 1;.   
df70: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
df80: 65 63 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  ectUsage(pMaskSe
df90: 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  t, p->x.pSelect)
dfa0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
dfb0: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
dfc0: 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57  mask |= sqlite3W
dfd0: 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
dfe0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78  e(pMaskSet, p->x
dff0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72  .pList);.  }.  r
e000: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 42 69  eturn mask;.}.Bi
e010: 74 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65  tmask sqlite3Whe
e020: 72 65 45 78 70 72 55 73 61 67 65 28 57 68 65 72  reExprUsage(Wher
e030: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
e040: 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  et, Expr *p){.  
e050: 72 65 74 75 72 6e 20 70 20 3f 20 73 71 6c 69 74  return p ? sqlit
e060: 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65  e3WhereExprUsage
e070: 4e 4e 28 70 4d 61 73 6b 53 65 74 2c 70 29 20 3a  NN(pMaskSet,p) :
e080: 20 30 3b 0a 7d 0a 42 69 74 6d 61 73 6b 20 73 71   0;.}.Bitmask sq
e090: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69  lite3WhereExprLi
e0a0: 73 74 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  stUsage(WhereMas
e0b0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
e0c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e0d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74  {.  int i;.  Bit
e0e0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
e0f0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
e100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
e110: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
e120: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73  .      mask |= s
e130: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
e140: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
e150: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
e160: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
e170: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 0a  eturn mask;.}...
e180: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
e190: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
e1a0: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
e1b0: 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 4e  lause.  .**.** N
e1c0: 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
e1d0: 6c 79 7a 65 28 29 20 6d 69 67 68 74 20 61 64 64  lyze() might add
e1e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
e1f0: 6d 73 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20 65  ms onto the.** e
e200: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
e210: 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
e220: 6f 74 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ot want to analy
e230: 7a 65 20 74 68 65 73 65 20 6e 65 77 0a 2a 2a 20  ze these new.** 
e240: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
e250: 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
e260: 67 20 61 74 20 74 68 65 20 65 6e 64 20 61 6e 64  g at the end and
e270: 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 0a 2a 2a   work forward.**
e280: 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
e290: 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
e2a0: 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
e2b0: 73 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ssed..*/.void sq
e2c0: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e  lite3WhereExprAn
e2d0: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
e2e0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
e2f0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
e300: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
e310: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
e320: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
e330: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
e340: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
e350: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
e360: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
e370: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
e380: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
e390: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
e3a0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c 65  ./*.** For table
e3b0: 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
e3c0: 73 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  s, transform the
e3d0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
e3e0: 6e 74 73 20 69 6e 74 6f 0a 2a 2a 20 6e 65 77 20  nts into.** new 
e3f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
e400: 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 45 61 63 68  ms.  .**.** Each
e410: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
e420: 6e 74 20 74 72 61 6e 73 6c 61 74 65 73 20 69 6e  nt translates in
e430: 74 6f 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  to an equality c
e440: 6f 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e 73  onstraint agains
e450: 74 0a 2a 2a 20 61 20 48 49 44 44 45 4e 20 63 6f  t.** a HIDDEN co
e460: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
e470: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
e480: 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 72  e3WhereTabFuncAr
e490: 67 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  gs(.  Parse *pPa
e4a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
e4b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e4c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e4d0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
e4e0: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20  tem *pItem,     
e4f0: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
e500: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 70 72 6f  ause term to pro
e510: 63 65 73 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  cess */.  WhereC
e520: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
e530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
e540: 66 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  fer function arg
e550: 75 6d 65 6e 74 73 20 74 6f 20 68 65 72 65 20 2a  uments to here *
e560: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
e570: 61 62 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a  ab;.  int j, k;.
e580: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67    ExprList *pArg
e590: 73 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 6c 52  s;.  Expr *pColR
e5a0: 65 66 3b 0a 20 20 45 78 70 72 20 2a 70 54 65 72  ef;.  Expr *pTer
e5b0: 6d 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  m;.  if( pItem->
e5c0: 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
e5d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62  ) return;.  pTab
e5e0: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
e5f0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
e600: 30 20 29 3b 0a 20 20 70 41 72 67 73 20 3d 20 70  0 );.  pArgs = p
e610: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
e620: 67 3b 0a 20 20 69 66 28 20 70 41 72 67 73 3d 3d  g;.  if( pArgs==
e630: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
e640: 72 28 6a 3d 6b 3d 30 3b 20 6a 3c 70 41 72 67 73  r(j=k=0; j<pArgs
e650: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
e660: 20 20 20 77 68 69 6c 65 28 20 6b 3c 70 54 61 62     while( k<pTab
e670: 2d 3e 6e 43 6f 6c 20 26 26 20 28 70 54 61 62 2d  ->nCol && (pTab-
e680: 3e 61 43 6f 6c 5b 6b 5d 2e 63 6f 6c 46 6c 61 67  >aCol[k].colFlag
e690: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44  s & COLFLAG_HIDD
e6a0: 45 4e 29 3d 3d 30 20 29 7b 6b 2b 2b 3b 7d 0a 20  EN)==0 ){k++;}. 
e6b0: 20 20 20 69 66 28 20 6b 3e 3d 70 54 61 62 2d 3e     if( k>=pTab->
e6c0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
e6d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e6e0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
e6f0: 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 28  arguments on %s(
e700: 29 20 2d 20 6d 61 78 20 25 64 22 2c 0a 20 20 20  ) - max %d",.   
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
e730: 6a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  j);.      return
e740: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
e750: 52 65 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ref = sqlite3Exp
e760: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
e770: 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c  b, TK_COLUMN, 0,
e780: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
e790: 6c 52 65 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  lRef==0 ) return
e7a0: 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d 3e 69  ;.    pColRef->i
e7b0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
e7c0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 6f 6c  Cursor;.    pCol
e7d0: 52 65 66 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6b  Ref->iColumn = k
e7e0: 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d  ++;.    pColRef-
e7f0: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
e800: 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
e810: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
e820: 4b 5f 45 51 2c 20 70 43 6f 6c 52 65 66 2c 0a 20  K_EQ, pColRef,. 
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e850: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
e860: 62 2c 20 70 41 72 67 73 2d 3e 61 5b 6a 5d 2e 70  b, pArgs->a[j].p
e870: 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 77  Expr, 0));.    w
e880: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
e890: 28 70 57 43 2c 20 70 54 65 72 6d 2c 20 54 45 52  (pWC, pTerm, TER
e8a0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  M_DYNAMIC);.  }.
e8b0: 7d 0a                                            }.