/ Hex Artifact Content
Login

Artifact edbd73a87ba2e186928e9bfc14348b1bbb2628c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45  while( pScan->iE
1950: 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv<=pScan->nEq
1960: 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20  uiv ){.    iCur 
1970: 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70  = pScan->aiCur[p
1980: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
1990: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
19a0: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
19b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
19c0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
19d0: 3d 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63  ==XN_EXPR && pSc
19e0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20  an->pIdxExpr==0 
19f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a00: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
1a10: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
1a20: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a30: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a40: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a50: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a60: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a70: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a80: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a90: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1aa0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1ab0: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1ac0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ad0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ae0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
1af0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
1b00: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1b10: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1b20: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1b30: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1b40: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1b50: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1b60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1b70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1b80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b90: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1ba0: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
1bb0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
1bc0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
1bd0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
1be0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1bf0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
1c00: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1c10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1c20: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1c30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1c50: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1c60: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1c80: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1c90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1ca0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
1cb0: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
1cc0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1d20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1d30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1d40: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1d60: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1d70: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1d80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1d90: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1da0: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1db0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1dc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1dd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1de0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e00: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1e10: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1e20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e30: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1e40: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1e50: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1e60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e70: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1eb0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1ec0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1ed0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ee0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1ef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1f00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1f10: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1f20: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f70: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1fa0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1fb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1ff0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
2000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2010: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
2020: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2030: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2060: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
2070: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2090: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
20d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
20e0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2100: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
2110: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
2120: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
2130: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
2140: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
2150: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
2160: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
2170: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
2180: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
2190: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21c0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
21d0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
2200: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
2210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2220: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
2230: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2240: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
2250: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
2260: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
2270: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
2280: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
2290: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
22a0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
22b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
22c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
22e0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
22f0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
2300: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2310: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2320: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2330: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2340: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2360: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2370: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2380: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2390: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
23a0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
23b0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
23c0: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
23d0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
23e0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
23f0: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
2400: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
2410: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
2420: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
2430: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2440: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
2450: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2460: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2470: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2480: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2490: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
24a0: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
24b0: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
24c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24d0: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
24e0: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
24f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2500: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2510: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
2520: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
2530: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
2540: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
2550: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2560: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2570: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2580: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2590: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
25a0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
25b0: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
25c0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
25d0: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
25e0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
25f0: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2600: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2610: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
2620: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
2630: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
2640: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
2650: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2660: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2670: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2680: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
26b0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
26f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2700: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2710: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
2720: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
2730: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
2740: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
2750: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2760: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2770: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2780: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2790: 0a 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b  .){.  int j = 0;
27a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
27b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
27c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
27d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
27e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
27f0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2800: 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20  >pIdxExpr = 0;. 
2810: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2820: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
2830: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
2840: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2850: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2860: 58 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d  XN_EXPR ) pScan-
2870: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2880: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
28a0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
28b0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
28c0: 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
28d0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  D;.  }.  if( pId
28e0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
28f0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
2900: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
2910: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
2930: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2940: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2950: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
2960: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
2970: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
2980: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2990: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
29a0: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
29b0: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
29c0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
29d0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
29e0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
29f0: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
2a00: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
2a10: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
2a20: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
2a30: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2a50: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
2a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2a70: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
2a80: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2a90: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2aa0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ab0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2ac0: 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66 20  able iCur or of 
2ad0: 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69 66  index pIdx.** if
2ae0: 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70   pIdx!=0 and <op
2af0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  > is one of the 
2b00: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
2b10: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
2b20: 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72 61  y.** the op para
2b30: 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61  meter.  Return a
2b40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b50: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
2b60: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2b70: 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20 74  .** If pIdx!=0 t
2b80: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 6f  hen it must be o
2b90: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65  ne of the indexe
2ba0: 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  s of table iCur.
2bb0: 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72    .** Search for
2bc0: 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20   terms matching 
2bd0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
2be0: 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a  olumn of pIdx.**
2bf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
2c00: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
2c10: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2c30: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
2c40: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
2c50: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
2c60: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
2c70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c80: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
2c90: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
2ca0: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
2cb0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
2cc0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
2cd0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
2ce0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
2cf0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
2d00: 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75  * aiCur[]/iaColu
2d10: 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64  mn[] arrays hold
2d20: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
2d30: 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72  quivalents. Ther
2d40: 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74  e are 11.** slot
2d50: 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43  s in aiCur[]/aiC
2d60: 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20  olumn[] so that 
2d70: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f  means we can loo
2d80: 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20  k for X plus up 
2d90: 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65  to 10.** other e
2da0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
2db0: 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  .  Hence a searc
2dc0: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
2dd0: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
2de0: 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20  A1.** and A1=A2 
2df0: 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e  and A2=A3 and ..
2e00: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
2e10: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
2e20: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
2e30: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
2e40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2e50: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
2e60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
2e70: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
2e80: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
2e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
2ea0: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
2eb0: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
2ec0: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
2ed0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
2ee0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
2ef0: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
2f00: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
2f10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
2f20: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
2f30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
2f40: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
2f50: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
2f60: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
2f70: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
2f80: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
2f90: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
2fa0: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
2fb0: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
2fc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
2fd0: 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54  EQUIV..*/.WhereT
2fe0: 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72  erm *sqlite3Wher
2ff0: 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  eFindTerm(.  Whe
3000: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3010: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3020: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
3030: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3040: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3050: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3060: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3070: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3080: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3090: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
30a0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
30b0: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
30c0: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
30d0: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
30e0: 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20  .  u32 op,      
30f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
3100: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
3110: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
3120: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
3130: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3140: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3150: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3160: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3170: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3180: 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20  Term *pResult = 
3190: 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  0;.  WhereTerm *
31a0: 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  p;.  WhereScan s
31b0: 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72  can;..  p = wher
31c0: 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
31d0: 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c   pWC, iCur, iCol
31e0: 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a  umn, op, pIdx);.
31f0: 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f    op &= WO_EQ|WO
3200: 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  _IS;.  while( p 
3210: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  ){.    if( (p->p
3220: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3230: 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
3240: 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71     if( p->prereq
3250: 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e  Right==0 && (p->
3260: 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30  eOperator&op)!=0
3270: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
3280: 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74  case( p->eOperat
3290: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
32a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
32b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32c0: 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70  ( pResult==0 ) p
32d0: 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20  Result = p;.    
32e0: 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53  }.    p = whereS
32f0: 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a  canNext(&scan);.
3300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3310: 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  sult;.}../*.** T
3320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
3330: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
3340: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  an entry that ma
3350: 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
3360: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
3370: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
3380: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
3390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
33a0: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
33b0: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
33c0: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
33d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
33e0: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
33f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3400: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
3410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3440: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3450: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
3460: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3470: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
3480: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
3490: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
34a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34b0: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
34c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
34d0: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
34e0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3500: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
3510: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
3520: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3540: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
3550: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
3560: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
3570: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
3580: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
3590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
35a0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
35b0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
35c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
35d0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
35e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
35f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3600: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
3610: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
3620: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
3630: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
3640: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
3650: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
3660: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3670: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
3680: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
3690: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
36a0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
36b0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
36c0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
36d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
36e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3710: 54 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c  TRUE if the iCol
3720: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
3730: 64 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20  dex pIdx is NOT 
3740: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
3750: 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  nt indexColumnNo
3760: 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64  tNull(Index *pId
3770: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
3780: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
3790: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73   pIdx!=0 );.  as
37a0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
37b0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
37c0: 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64  umn );.  j = pId
37d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
37e0: 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b  ];.  if( j>=0 ){
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78  .    return pIdx
3800: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
3810: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c  ].notNull;.  }el
3820: 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29  se if( j==(-1) )
3830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3850: 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a  ert( j==(-2) );.
3860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
3870: 2a 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65  * Assume an inde
3880: 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63  xed expression c
3890: 61 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20  an always yield 
38a0: 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d  a NULL */..  }.}
38b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
38c0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
38d0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
38e0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
38f0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
3900: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
3910: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
3920: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
3930: 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73  dant if any subs
3940: 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  et of the column
3950: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54  s in the.** DIST
3960: 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f  INCT list are co
3970: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
3980: 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  e and individual
3990: 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  ly non-null..*/.
39a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
39b0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
39c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
39e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
39f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
3a00: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
3a10: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
3a20: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a30: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
3a40: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3a50: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
3a60: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
3a70: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
3a80: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
3a90: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
3aa0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3ab0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
3ac0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
3af0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
3b00: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
3b10: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
3b20: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
3b30: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
3b40: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
3b50: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
3b60: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
3b70: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
3b80: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
3b90: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
3ba0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
3bb0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
3bc0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
3bd0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
3be0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
3bf0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
3c00: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
3c10: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
3c20: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
3c30: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
3c40: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
3c50: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
3c60: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
3c70: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
3c80: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
3c90: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
3ca0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
3cb0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
3cc0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
3cd0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
3ce0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
3cf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3d00: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
3d10: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
3d20: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
3d30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
3d40: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3d50: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
3d60: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
3d70: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
3d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
3d90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
3da0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
3db0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
3dc0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
3dd0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
3de0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3df0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
3e00: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
3e10: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
3e20: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
3e30: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
3e40: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
3e50: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3e60: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
3e70: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
3e80: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
3e90: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
3ea0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3eb0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
3ec0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
3ed0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
3ee0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
3ef0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
3f00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
3f10: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
3f20: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
3f30: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
3f40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
3f50: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
3f60: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
3f70: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
3f80: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
3f90: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
3fa0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3fb0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
3fc0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
3fd0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
3fe0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
3ff0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
4000: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
4010: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
4020: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
4030: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4040: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
4050: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
4060: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4070: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
4080: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4090: 30 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46  0==sqlite3WhereF
40a0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
40b0: 73 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b  se, i, ~(Bitmask
40c0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
40d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
40e0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
40f0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
4100: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c  iBase, pIdx, i)<
4110: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4120: 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75     if( indexColu
4130: 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20  mnNotNull(pIdx, 
4140: 69 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i)==0 ) break;. 
4150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4160: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
4170: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
4180: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
4190: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
41a0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
41b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
41c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
41e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
41f0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
4200: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
4210: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
4220: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
4230: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
4240: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
4250: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
4260: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
4270: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
4280: 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d  Convert OP_Colum
4290: 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f  n opcodes to OP_
42a0: 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73  Copy in previous
42b0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ly generated cod
42c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
42d0: 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20  utine runs over 
42e0: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
42f0: 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74  ode and translat
4300: 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20  es OP_Column.** 
4310: 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f  opcodes into OP_
4320: 43 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61  Copy when the ta
4330: 62 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63  ble is being acc
4340: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
4350: 74 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64  tine .** instead
4360: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
4370: 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  okup..**.** If t
4380: 68 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61  he bIncrRowid pa
4390: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
43a0: 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20  en any OP_Rowid 
43b0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a  instructions on.
43c0: 2a 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75  ** cursor iTabCu
43d0: 72 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65  r are transforme
43e0: 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20  d into OP_Null. 
43f0: 4f 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69  Or, if bIncrRowi
4400: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a  d is non-zero,.*
4410: 2a 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52  * then each OP_R
4420: 6f 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72  owid is transfor
4430: 6d 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  med into an inst
4440: 72 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65  ruction to incre
4450: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ment the.** valu
4460: 65 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20  e stored in its 
4470: 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e  output register.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
44a0: 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76  oCopy(.  Vdbe *v
44b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
44c0: 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e  The VDBE contain
44d0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e  ing code to tran
44e0: 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  slate */.  int i
44f0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4500: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4520: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4530: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4540: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4550: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4560: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4570: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4580: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4590: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
45a0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
45c0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
45d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
45e0: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
45f0: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4600: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
4610: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4620: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4630: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4640: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4650: 64 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20  ddr(v);.  for(; 
4660: 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74  iStart<iEnd; iSt
4670: 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  art++, pOp++){. 
4680: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
4690: 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
46a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ue;.    if( pOp-
46b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
46c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  mn ){.      pOp-
46d0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
46e0: 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  y;.      pOp->p1
46f0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65   = pOp->p2 + iRe
4700: 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f  gister;.      pO
4710: 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b  p->p2 = pOp->p3;
4720: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  .      pOp->p3 =
4730: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
4740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
4750: 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
4760: 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20   if( bIncrRowid 
4770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
4780: 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
4790: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
47a0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P2 operand of th
47b0: 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20  e OP_Rowid. */. 
47c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
47d0: 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a  de = OP_AddImm;.
47e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
47f0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
4800: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a     pOp->p2 = 1;.
4810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4820: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4830: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
4840: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b      pOp->p1 = 0;
4850: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
4860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4870: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4880: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
4890: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
48a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
48b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
48c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
48d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
48e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
48f0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
4900: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
4910: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
4920: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
4930: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
4940: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
4950: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
4960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4970: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
4980: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
4990: 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
49a0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
49b0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
49c0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
49d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
49e0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
49f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4a00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4a10: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4a20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4a30: 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
4a40: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
4a50: 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
4a60: 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
4a70: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
4a80: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4a90: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
4aa0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4ab0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
4ac0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4ad0: 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
4ae0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4af0: 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
4b00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4b10: 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4b30: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4b40: 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
4b50: 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
4b60: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4b70: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
4b80: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
4b90: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
4ba0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
4bb0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
4bc0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
4bd0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
4be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
4bf0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
4c00: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4c10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4c20: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4c30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c40: 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
4c50: 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
4c60: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4c70: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4c80: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
4c90: 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
4ca0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4cb0: 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
4cc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
4cd0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
4ce0: 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
4cf0: 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
4d00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d10: 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
4d20: 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
4d30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4d40: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
4d50: 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
4d60: 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
4d70: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4d80: 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
4d90: 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
4da0: 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71  matedCost);.  sq
4db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4dc0: 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77  ("  estimatedRow
4dd0: 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73  s=%lld\n", p->es
4de0: 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a  timatedRows);.}.
4df0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
4e00: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
4e10: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
4e20: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
4e30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
4e50: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
4e60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4e70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4e80: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
4e90: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
4ea0: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
4eb0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
4ec0: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
4ed0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
4ee0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
4ef0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
4f00: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
4f10: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
4f20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
4f50: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
4f60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4f70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
4f80: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
4f90: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
4fa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4fb0: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
4fc0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
4fd0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
4fe0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
4ff0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
5000: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
5010: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
5020: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
5030: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
5040: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
5050: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75  O_IS))==0 ) retu
5060: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5070: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5080: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
5090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
50a0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
50b0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
50c0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
50d0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
50e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
50f0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
5100: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
5110: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
5120: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
5130: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
5140: 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
5150: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
5160: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5170: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
5180: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5190: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
51a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
51b0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
51c0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
51d0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
51e0: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
51f0: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
5200: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
5210: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
5220: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
5230: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
5240: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
5250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5260: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
5270: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
5280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
52a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
52b0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
52c0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
52d0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
52e0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
52f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5300: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
5310: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
5320: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
5330: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
5340: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
5350: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
5360: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
5370: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
5380: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
5390: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
53a0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
53b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
53c0: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
53d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
53e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
53f0: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
5400: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
5410: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
5430: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
5440: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
5450: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
5460: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
5470: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
5480: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
5490: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
54a0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
54b0: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
54c0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
54d0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54f0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
5500: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
5510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
5520: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
5530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5540: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
5550: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
5560: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
5570: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
5580: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5590: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
55a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
55b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
55c0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
55d0: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
55e0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
55f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5600: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5610: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
5620: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
5650: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5660: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5670: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5680: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5690: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
56b0: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
56c0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
56d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56f0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5700: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
5710: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
5720: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
5730: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
5740: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
5750: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
5760: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5770: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
5780: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
5790: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
57a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
57b0: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
57c0: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
57d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
57e0: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
57f0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
5800: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5810: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
5820: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
5830: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
5840: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
5850: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
5860: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
5870: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
5880: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
5890: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
58a0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
58b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
58c0: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
58d0: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73  uded rows */.  s
58e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58f0: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
5900: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
5910: 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  rm being indexed
5920: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
5930: 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  unter = 0;      
5940: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65    /* Address whe
5950: 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74  re integer count
5960: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5970: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5980: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5990: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
59a0: 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72  egisters where r
59b0: 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c  ecord is assembl
59c0: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
59d0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
59e0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
59f0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
5a00: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
5a10: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
5a20: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
5a30: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
5a40: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
5a50: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
5a60: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
5a70: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
5a80: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
5a90: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
5aa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5ab0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
5ac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5ad0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
5ae0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
5af0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
5b00: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
5b10: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
5b20: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
5b30: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
5b40: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
5b50: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
5b60: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
5b70: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
5b80: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
5b90: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5ba0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5bb0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5bc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
5bd0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
5be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
5bf0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5c00: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
5c10: 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20  n)    /* prereq 
5c20: 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20  always non-zero 
5c30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
5c40: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
5c50: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
5c60: 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20  rsor   /*   for 
5c70: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20  the right-hand  
5c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
5c90: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30  pLoop->prereq!=0
5ca0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
5cb0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62          /*   tab
5cc0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
5cd0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  N */.    if( pLo
5ce0: 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20  op->prereq==0.  
5cf0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
5d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
5d10: 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26  TUAL)==0.     &&
5d20: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5d30: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
5d40: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71  Join).     && sq
5d50: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
5d60: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20  Constant(pExpr, 
5d70: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29  pSrc->iCursor) )
5d80: 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c  {.      pPartial
5d90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
5da0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  d(pParse->db, pP
5db0: 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20  artial,.        
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5de0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5df0: 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  b, pExpr, 0));. 
5e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
5e10: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
5e20: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
5e30: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
5e40: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
5e50: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
5e60: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
5e70: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
5e80: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
5e90: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
5ea0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5eb0: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
5ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5ed0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5ee0: 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e     if( !sentWarn
5ef0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
5f00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5f10: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
5f20: 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DEX,.           
5f30: 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65   "automatic inde
5f40: 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54  x on %s(%s)", pT
5f50: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
5f60: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
5f70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
5f80: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74  e);.        sent
5f90: 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Warning = 1;.   
5fa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
5fb0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
5fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
5fd0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
5fe0: 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
5ff0: 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  Loop, nKeyCol+1)
6000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
6010: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6020: 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20  x_create;.      
6030: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
6040: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
6050: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
6060: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
6070: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
6080: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6090: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
60a0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
60b0: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
60c0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
60d0: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
60e0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
60f0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
6100: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
6110: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
6120: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
6130: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
6140: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
6150: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
6160: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6170: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
6180: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
6190: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
61a0: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
61b0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
61c0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
61d0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
61e0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
61f0: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
6200: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
6210: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
6220: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
6230: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
6240: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
6250: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
6260: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
6270: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
6280: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
6290: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
62a0: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
62b0: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
62c0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
62d0: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
62e0: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
62f0: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
6300: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
6310: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
6320: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
6330: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
6340: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28   mxBitCol = MIN(
6350: 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43  BMS-1,pTable->nC
6360: 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ol);.  testcase(
6370: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
6380: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
6390: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
63a0: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
63b0: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
63c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
63d0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
63e0: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
63f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
6400: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
6410: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
6420: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
6430: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
6440: 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  S + 1;.  }..  /*
6450: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
6460: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
6470: 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
6480: 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  ex */.  pIdx = s
6490: 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
64a0: 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65  dexObject(pParse
64b0: 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c  ->db, nKeyCol+1,
64c0: 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a   0, &zNotUsed);.
64d0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
64e0: 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e  goto end_auto_in
64f0: 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c  dex_create;.  pL
6500: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
6510: 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
6520: 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
6530: 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
6540: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
6550: 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
6560: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
6570: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
6580: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
6590: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
65a0: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
65b0: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
65c0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
65d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
65e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
65f0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
6600: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
6610: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
6620: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
6630: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6640: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
6650: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6660: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
6670: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
6680: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
6690: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
66a0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
66b0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
66c0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
66d0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
66e0: 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
66f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
6700: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
6710: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
6720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
6730: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
6740: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
6750: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6760: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
6770: 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65  ->zName : sqlite
6780: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6790: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
67a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
67b0: 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f  ert( (u32)n==pLo
67c0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
67d0: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
67e0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
67f0: 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
6800: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6810: 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
6820: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
6830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
6840: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
6850: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
6860: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a  & MASKBIT(i) ){.
6870: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6880: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
6890: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
68a0: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
68b0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
68c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
68d0: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
68e0: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
68f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
6900: 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
6910: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6920: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6930: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6940: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6950: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6960: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6970: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
6980: 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20   n==nKeyCol );. 
6990: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
69a0: 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  n] = XN_ROWID;. 
69b0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
69d0: 41 52 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ARY;..  /* Creat
69e0: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
69f0: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
6a00: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
6a10: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
6a20: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
6a30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
6a40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6a50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
6a60: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
6a70: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
6a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6a90: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
6aa0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
6ab0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
6ac0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
6ad0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
6ae0: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
6af0: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
6b00: 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tent */.  sqlite
6b10: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
6b20: 50 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74  Parse);.  pTabIt
6b30: 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66  em = &pWC->pWInf
6b40: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
6b50: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
6b60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6b70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6b80: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
6b90: 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
6ba0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64  egReturn;.    ad
6bb0: 64 72 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  drCounter = sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6bd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6be0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6bf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c00: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
6c10: 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
6c20: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
6c30: 62 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  b);.    addrTop 
6c40: 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
6c50: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
6c60: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
6c70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6c80: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
6c90: 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
6ca0: 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
6cb0: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
6cc0: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
6cd0: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
6ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6cf0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
6d00: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64  el->iTabCur); Vd
6d10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6d20: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61   }.  if( pPartia
6d30: 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e  l ){.    iContin
6d40: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
6d50: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
6d70: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61  alse(pParse, pPa
6d80: 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65  rtial, iContinue
6d90: 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
6da0: 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  ULL);.    pLoop-
6db0: 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
6dc0: 45 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20  E_PARTIALIDX;.  
6dd0: 7d 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  }.  regRecord = 
6de0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6df0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6e00: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
6e10: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a  nerateIndexKey(.
6e20: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49        pParse, pI
6e30: 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
6e40: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
6e50: 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  0, 0, 0, 0.  );.
6e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e70: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6e80: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
6e90: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
6ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
6eb0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6ec0: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
6ed0: 3b 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  ;.  if( pPartial
6ee0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
6ef0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
6f00: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
6f10: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6f20: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6f30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6f40: 67 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e  geP2(v, addrCoun
6f50: 74 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b  ter, regBase+n);
6f60: 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f  .    translateCo
6f70: 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64  lumnToCopy(v, ad
6f80: 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  drTop, pLevel->i
6f90: 54 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d  TabCur, pTabItem
6fa0: 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  ->regResult, 1);
6fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6fc0: 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
6fd0: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
6fe0: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6ff0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7010: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
7020: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
7030: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
7040: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7050: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
7060: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
7070: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
7080: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
7090: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
70a0: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
70b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
70c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
70d0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
70e0: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
70f0: 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
7100: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
7110: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
7120: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
7130: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7140: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
7150: 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
7160: 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
7170: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7180: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
7190: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
71a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
71b0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
71c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
71d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
71e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
71f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
7200: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7210: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
7220: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
7230: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
7240: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
7250: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
7260: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
7270: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
7280: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
7290: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
72a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
72b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
72c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
72d0: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
72e0: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
72f0: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
7300: 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d  use *pWC,.  Bitm
7310: 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20  ask mUnusable,  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7330: 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68  gnore terms with
7340: 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a   these prereqs *
7350: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7360: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20  st_item *pSrc,. 
7370: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7380: 72 42 79 2c 0a 20 20 75 31 36 20 2a 70 6d 4e 6f  rBy,.  u16 *pmNo
7390: 4f 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  Omit            
73a0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
73b0: 66 20 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20 6f  f terms not to o
73c0: 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
73d0: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
73e0: 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
73f0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7400: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
7410: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
7420: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
7430: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
7440: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7450: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
7460: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
7470: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
7480: 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
7490: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
74a0: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
74b0: 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 20  ;.  u16 mNoOmit 
74c0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  = 0;..  /* Count
74d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
74e0: 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
74f0: 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
7500: 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20   referring.  ** 
7510: 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
7520: 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
7530: 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d  =nTerm=0, pTerm=
7540: 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
7550: 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
7560: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
7570: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
7580: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
7590: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
75a0: 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
75b0: 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62  qRight & mUnusab
75c0: 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
75d0: 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77     assert( IsPow
75e0: 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65  erOfTwo(pTerm->e
75f0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45  Operator & ~WO_E
7600: 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73  QUIV) );.    tes
7610: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7620: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
7630: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7640: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7650: 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
7660: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7670: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7680: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74  & WO_IS );.    t
7690: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
76a0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
76b0: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  LL );.    if( (p
76c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
76d0: 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  & ~(WO_ISNULL|WO
76e0: 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d  _EQUIV|WO_IS))==
76f0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
7700: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
7710: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
7720: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
7730: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
7740: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28  >u.leftColumn>=(
7750: 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d  -1) );.    nTerm
7760: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
7770: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
7780: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
7790: 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
77a0: 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
77b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
77c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
77d0: 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
77e0: 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
77f0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
7800: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7810: 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
7820: 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
7830: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
7840: 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
7850: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
7860: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
7870: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
7880: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
7890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
78a0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
78b0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
78c0: 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
78d0: 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
78e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
78f0: 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
7900: 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
7910: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
7920: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
7930: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7940: 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
7950: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
7960: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
7970: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
7980: 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
79b0: 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
79c0: 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
79f0: 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
7a00: 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
7a10: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
7a20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
7a30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7a40: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
7a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7a60: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
7a70: 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
7a80: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
7a90: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
7aa0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
7ab0: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
7ac0: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
7ad0: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
7ae0: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
7af0: 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
7b00: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
7b10: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
7b20: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
7b30: 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
7b40: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
7b50: 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
7b60: 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
7b70: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7b80: 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
7b90: 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
7ba0: 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
7bb0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
7bc0: 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
7bd0: 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
7be0: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
7bf0: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7c00: 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
7c10: 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
7c20: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
7c30: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
7c40: 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
7c50: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
7c60: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
7c70: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
7c80: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7c90: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
7ca0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
7cb0: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
7cc0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7cd0: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
7ce0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
7cf0: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
7d00: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
7d10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7d20: 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
7d30: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
7d40: 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
7da0: 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
7db0: 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
7dc0: 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
7dd0: 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
7de0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
7df0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
7e00: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
7e10: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
7e20: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
7e30: 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74  mUnusable ) cont
7e40: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
7e50: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
7e60: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7e70: 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
7e80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7e90: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7ea0: 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
7eb0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7ec0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
7ed0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7ee0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7ef0: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
7f00: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7f10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7f20: 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20   & WO_ALL );.   
7f30: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
7f40: 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53  erator & ~(WO_IS
7f50: 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f  NULL|WO_EQUIV|WO
7f60: 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  _IS))==0 ) conti
7f70: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
7f80: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
7f90: 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
7fa0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7fb0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
7fc0: 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20  lumn>=(-1) );.  
7fd0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43    pIdxCons[j].iC
7fe0: 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75  olumn = pTerm->u
7ff0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
8000: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65   pIdxCons[j].iTe
8010: 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  rmOffset = i;.  
8020: 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d    op = (u8)pTerm
8030: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8040: 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70  _ALL;.    if( op
8050: 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57  ==WO_IN ) op = W
8060: 4f 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70  O_EQ;.    if( op
8070: 3d 3d 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20  ==WO_MATCH ){.  
8080: 20 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e      op = pTerm->
8090: 65 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a  eMatchOp;.    }.
80a0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
80b0: 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20  op = op;.    /* 
80c0: 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
80d0: 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
80e0: 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
80f0: 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
8100: 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
8110: 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
8120: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
8130: 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
8140: 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
8150: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
8160: 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
8170: 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
8180: 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
8190: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
81a0: 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
81b0: 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
81c0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
81d0: 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
81e0: 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
81f0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8200: 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
8210: 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
8220: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8230: 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
8240: 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
8250: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8260: 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
8270: 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
8280: 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
8290: 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
82a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
82b0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
82c0: 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   & (WO_IN|WO_EQ|
82d0: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
82e0: 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
82f0: 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70  ) );..    if( op
8300: 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c   & (WO_LT|WO_LE|
8310: 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20  WO_GT|WO_GE).   
8320: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
8330: 49 73 56 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e  IsVector(pTerm->
8340: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20 0a  pExpr->pRight) .
8350: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
8360: 20 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20   i<16 ) mNoOmit 
8370: 7c 3d 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20  |= (1 << i);.   
8380: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54     if( op==WO_LT
8390: 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f   ) pIdxCons[j].o
83a0: 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  p = WO_LE;.     
83b0: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29   if( op==WO_GT )
83c0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
83d0: 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a 0a  = WO_GE;.    }..
83e0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
83f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
8400: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
8410: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
8420: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
8430: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
8440: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
8450: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
8460: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
8470: 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
8480: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
8490: 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f  r;.  }..  *pmNoO
84a0: 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20  mit = mNoOmit;. 
84b0: 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
84c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
84d0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
84e0: 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
84f0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8500: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
8510: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
8520: 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
8530: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
8540: 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
8550: 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
8560: 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
8570: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
8580: 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
8590: 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
85a0: 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
85b0: 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
85c0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
85d0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
85e0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
85f0: 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
8600: 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
8610: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
8620: 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
8630: 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
8640: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
8650: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
8660: 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
8670: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
8680: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
8690: 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
86a0: 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
86b0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
86c0: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
86d0: 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
86e0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
86f0: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
8700: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
8710: 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
8720: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
8730: 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
8740: 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
8750: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
8760: 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
8770: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8780: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
8790: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
87a0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
87b0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
87c0: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
87d0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
87e0: 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  >pVtab;.  int rc
87f0: 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  ;..  TRACE_IDX_I
8800: 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
8810: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
8820: 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
8830: 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
8840: 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
8850: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8860: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
8870: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8880: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8890: 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72 73 65 2d  OomFault(pParse-
88a0: 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  >db);.    }else 
88b0: 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
88c0: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
88d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
88e0: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
88f0: 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
8900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8910: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8920: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
8930: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
8940: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8950: 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
8960: 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
8970: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a  ->zErrMsg = 0;..
8980: 23 69 66 20 30 0a 20 20 2f 2a 20 54 68 69 73 20  #if 0.  /* This 
8990: 65 72 72 6f 72 20 69 73 20 6e 6f 77 20 63 61 75  error is now cau
89a0: 67 68 74 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ght by the calle
89b0: 72 2e 0a 20 20 2a 2a 20 53 65 61 72 63 68 20 66  r..  ** Search f
89c0: 6f 72 20 22 78 42 65 73 74 49 6e 64 65 78 20 6d  or "xBestIndex m
89d0: 61 6c 66 75 6e 63 74 69 6f 6e 22 20 62 65 6c 6f  alfunction" belo
89e0: 77 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  w */.  for(i=0; 
89f0: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
8a00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8a10: 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
8a20: 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
8a30: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
8a40: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
8a50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8a60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8a70: 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
8a80: 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
8a90: 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
8aa0: 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
8ab0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
8ac0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
8ad0: 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
8ae0: 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rr;.}.#endif /* 
8af0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8b00: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8b10: 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  E) */..#ifdef SQ
8b20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
8b30: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
8b40: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f   Estimate the lo
8b50: 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74  cation of a part
8b60: 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67  icular key among
8b70: 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a   all keys in an.
8b80: 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65  ** index.  Store
8b90: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
8ba0: 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73  aStat as follows
8bb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74  :.**.**    aStat
8bc0: 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [0]      Est. nu
8bd0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73  mber of rows les
8be0: 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20  s than pRec.**  
8bf0: 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20    aStat[1]      
8c00: 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
8c10: 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65  ows equal to pRe
8c20: 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  c.**.** Return t
8c30: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
8c40: 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74  sample that is t
8c50: 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70  he smallest samp
8c60: 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72  le that.** is gr
8c70: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
8c80: 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74  ual to pRec. Not
8c90: 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65  e that this inde
8ca0: 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65  x is not an inde
8cb0: 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53  x.** into the aS
8cc0: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20  ample[] array - 
8cd0: 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69  it is an index i
8ce0: 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65  nto a virtual se
8cf0: 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20  t of samples.** 
8d00: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
8d10: 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65  tents of aSample
8d20: 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  [] and the numbe
8d30: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72  r of fields in r
8d40: 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20  ecord .** pRec. 
8d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
8d60: 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20  hereKeyStats(.  
8d70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8d90: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8da0: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
8db0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
8dc0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
8dd0: 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20  consider domain 
8de0: 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  of */.  Unpacked
8df0: 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20  Record *pRec,   
8e00: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66      /* Vector of
8e10: 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69   values to consi
8e20: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75  der */.  int rou
8e30: 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20  ndUp,           
8e40: 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70       /* Round up
8e50: 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64   if true.  Round
8e60: 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a   down if false *
8e70: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74  /.  tRowcnt *aSt
8e80: 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  at              
8e90: 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72  /* OUT: stats wr
8ea0: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
8eb0: 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a  .  IndexSample *
8ec0: 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
8ed0: 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69  aSample;.  int i
8ee0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
8ef0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
8f00: 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61 74  of required stat
8f10: 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e  s in anEq[] etc.
8f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
8f50: 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52  rst sample >= pR
8f60: 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d  ec */.  int iSam
8f70: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
8f80: 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20      /* Smallest 
8f90: 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68  sample larger th
8fa0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
8fb0: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69  Rec */.  int iMi
8fc0: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
8fd0: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
8fe0: 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20   sample not yet 
8ff0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
9000: 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  iTest;          
9010: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
9020: 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a  sample to test *
9030: 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20  /.  int res;    
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d  /* Result of com
9060: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
9070: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c  n */.  int nFiel
9080: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9090: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
90a0: 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a  fields in pRec *
90b0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77  /.  tRowcnt iLow
90c0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
90d0: 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71  /* anLt[] + anEq
90e0: 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61  [] of largest sa
90f0: 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a  mple pRec is > *
9100: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
9110: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
9120: 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61 72  _PARAMETER( pPar
9130: 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  se );.#endif.  a
9140: 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20 29  ssert( pRec!=0 )
9150: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
9160: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
9170: 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e   assert( pRec->n
9180: 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d  Field>0 && pRec-
9190: 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e  >nField<=pIdx->n
91a0: 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20  SampleCol );..  
91b0: 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73  /* Do a binary s
91c0: 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68  earch to find th
91d0: 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67  e first sample g
91e0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
91f0: 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65  qual.  ** to pRe
9200: 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61  c. If pRec conta
9210: 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ins a single fie
9220: 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73  ld, the set of s
9230: 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68  amples to search
9240: 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20  .  ** is simply 
9250: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9260: 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70  ray. If the samp
9270: 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d  les in aSample[]
9280: 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20   contain more.  
9290: 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c  ** than one fiel
92a0: 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66  ds, all fields f
92b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72  ollowing the fir
92c0: 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  st are ignored..
92d0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65    **.  ** If pRe
92e0: 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65  c contains N fie
92f0: 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20  lds, where N is 
9300: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74  more than one, t
9310: 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74  hen as well as t
9320: 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20  he.  ** samples 
9330: 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72  in aSample[] (tr
9340: 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65  uncated to N fie
9350: 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63 68  lds), the search
9360: 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a   also has to.  *
9370: 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69  * consider prefi
9380: 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d  xes of those sam
9390: 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ples. For exampl
93a0: 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  e, if the set of
93b0: 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e   samples.  ** in
93c0: 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a   aSample is:.  *
93d0: 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70  *.  **     aSamp
93e0: 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a  le[0] = (a, 5) .
93f0: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9400: 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20  [1] = (a, 10) . 
9410: 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b   **     aSample[
9420: 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a  2] = (b, 5) .  *
9430: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d  *     aSample[3]
9440: 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a   = (c, 100) .  *
9450: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d  *     aSample[4]
9460: 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a   = (c, 105).  **
9470: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73  .  ** Then the s
9480: 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f 75  earch space shou
9490: 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68  ld ideally be th
94a0: 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20  e samples above 
94b0: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e  and the .  ** un
94c0: 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b 61  ique prefixes [a
94d0: 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20  ], [b] and [c]. 
94e0: 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20 69  But since that i
94f0: 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69  s hard to organi
9500: 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ze, .  ** the co
9510: 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72  de actually sear
9520: 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20  ches this set:. 
9530: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20   **.  **     0: 
9540: 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a  (a) .  **     1:
9550: 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (a, 5) .  **   
9560: 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20    2: (a, 10) .  
9570: 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30  **     3: (a, 10
9580: 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28  ) .  **     4: (
9590: 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20  b) .  **     5: 
95a0: 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (b, 5) .  **    
95b0: 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20   6: (c) .  **   
95c0: 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20    7: (c, 100) . 
95d0: 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31   **     8: (c, 1
95e0: 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20  05).  **     9: 
95f0: 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20  (c, 105).  **.  
9600: 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70  ** For each samp
9610: 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  le in the aSampl
9620: 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d  e[] array, N sam
9630: 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74  ples are present
9640: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66   in the.  ** eff
9650: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72  ective sample ar
9660: 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76  ray. In the abov
9670: 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64  e, samples 0 and
9680: 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20   1 are based on 
9690: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61  .  ** sample aSa
96a0: 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73  mple[0]. Samples
96b0: 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d   2 and 3 on aSam
96c0: 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a  ple[1] etc..  **
96d0: 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d  .  ** Often, sam
96e0: 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c  ple i of each bl
96f0: 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69  ock of N effecti
9700: 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28  ve samples has (
9710: 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a  i+1) fields..  *
9720: 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20 73  * Except, each s
9730: 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74  ample may be ext
9740: 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20  ended to ensure 
9750: 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61 74  that it is great
9760: 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20  er than or.  ** 
9770: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65  equal to the pre
9780: 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20  vious sample in 
9790: 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65  the array. For e
97a0: 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61  xample, in the a
97b0: 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70  bove, .  ** samp
97c0: 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72 73  le 2 is the firs
97d0: 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c  t sample of a bl
97e0: 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73  ock of N samples
97f0: 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69 74  , so at first it
9800: 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74   .  ** appears t
9810: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65  hat it should be
9820: 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65   1 field in size
9830: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  . However, that 
9840: 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20  would make it . 
9850: 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   ** smaller than
9860: 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68   sample 1, so th
9870: 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
9880: 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20  would not work. 
9890: 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20  As a result, .  
98a0: 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64 65  ** it is extende
98b0: 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e  d to two fields.
98c0: 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73 20   The duplicates 
98d0: 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74 65  that this create
98e0: 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63  s do not .  ** c
98f0: 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
9900: 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64  s..  */.  nField
9910: 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b   = pRec->nField;
9920: 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  .  iCol = 0;.  i
9930: 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e  Sample = pIdx->n
9940: 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b  Sample * nField;
9950: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69  .  do{.    int i
9960: 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Samp;           
9970: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9980: 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f  x in aSample[] o
9990: 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  f test sample */
99a0: 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  .    int n;     
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
99d0: 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73  fields in test s
99e0: 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54  ample */..    iT
99f0: 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d  est = (iMin+iSam
9a00: 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d  ple)/2;.    iSam
9a10: 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65  p = iTest / nFie
9a20: 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d  ld;.    if( iSam
9a30: 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  p>0 ){.      /* 
9a40: 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66  The proposed eff
9a50: 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73  ective sample is
9a60: 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d   a prefix of sam
9a70: 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  ple aSample[iSam
9a80: 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65  p]..      ** Spe
9a90: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73  cifically, the s
9aa0: 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20 6f  hortest prefix o
9ab0: 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20  f at least (1 + 
9ac0: 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20  iTest%nField) . 
9ad0: 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74       ** fields t
9ae0: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
9af0: 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  han the previous
9b00: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
9b10: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
9b20: 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65  (n=(iTest % nFie
9b30: 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c  ld) + 1; n<nFiel
9b40: 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; n++){.       
9b50: 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61   if( aSample[iSa
9b60: 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21  mp-1].anLt[n-1]!
9b70: 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e  =aSample[iSamp].
9b80: 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61  anLt[n-1] ) brea
9b90: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9ba0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
9bb0: 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d  iTest + 1;.    }
9bc0: 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65  ..    pRec->nFie
9bd0: 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20  ld = n;.    res 
9be0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
9bf0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9c00: 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61  le[iSamp].n, aSa
9c10: 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70  mple[iSamp].p, p
9c20: 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65  Rec);.    if( re
9c30: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f  s<0 ){.      iLo
9c40: 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53  wer = aSample[iS
9c50: 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b  amp].anLt[n-1] +
9c60: 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e   aSample[iSamp].
9c70: 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20  anEq[n-1];.     
9c80: 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b   iMin = iTest+1;
9c90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
9ca0: 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c  es==0 && n<nFiel
9cb0: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  d ){.      iLowe
9cc0: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  r = aSample[iSam
9cd0: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20  p].anLt[n-1];.  
9ce0: 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74      iMin = iTest
9cf0: 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  +1;.      res = 
9d00: 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
9d10: 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69       iSample = i
9d20: 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c  Test;.      iCol
9d30: 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20   = n-1;.    }.  
9d40: 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20 69  }while( res && i
9d50: 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20  Min<iSample );. 
9d60: 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e   i = iSample / n
9d70: 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  Field;..#ifdef S
9d80: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
9d90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
9da0: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
9db0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
9dc0: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f  binary search co
9dd0: 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f  de.  ** above fo
9de0: 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e  und the right an
9df0: 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b  swer. This block
9e00: 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f   serves no purpo
9e10: 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68  se other.  ** th
9e20: 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  an to invoke the
9e30: 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20   asserts.  */.  
9e40: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
9e50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
9e60: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ){.    if( res==
9e70: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
9e80: 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75   (res==0) is tru
9e90: 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  e, then pRec mus
9ea0: 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61  t be equal to sa
9eb0: 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20  mple i. */.     
9ec0: 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d   assert( i<pIdx-
9ed0: 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20  >nSample );.    
9ee0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
9ef0: 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20  nField-1 );.    
9f00: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
9f10: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61   nField;.      a
9f20: 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
9f30: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
9f40: 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c  re(aSample[i].n,
9f50: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70   aSample[i].p, p
9f60: 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20 20  Rec) .          
9f70: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9f80: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20  mallocFailed .  
9f90: 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
9fa0: 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73  {.      /* Unles
9fb0: 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  s i==pIdx->nSamp
9fc0: 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  le, indicating t
9fd0: 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72 67  hat pRec is larg
9fe0: 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  er than.      **
9ff0: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20   all samples in 
a000: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
a010: 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62  ray, pRec must b
a020: 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
a030: 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f  he.      ** (iCo
a040: 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66 69  l+1) field prefi
a050: 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20  x of sample i.  
a060: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a070: 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i<=pIdx->nSampl
a080: 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20  e && i>=0 );.   
a090: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
a0a0: 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20  = iCol+1;.      
a0b0: 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d  assert( i==pIdx-
a0c0: 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20  >nSample .      
a0d0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
a0e0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
a0f0: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
a100: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
a110: 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20  c)>0.           
a120: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
a130: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
a140: 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30        /* if i==0
a150: 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68   and iCol==0, th
a160: 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20 69  en record pRec i
a170: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61  s smaller than a
a180: 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20  ll samples.     
a190: 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70   ** in the aSamp
a1a0: 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65  le[] array. Othe
a1b0: 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e  rwise, if (iCol>
a1c0: 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73  0) then pRec mus
a1d0: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72  t.      ** be gr
a1e0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
a1f0: 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c  ual to the (iCol
a200: 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
a210: 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20  f sample i..    
a220: 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74    ** If (i>0), t
a230: 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c  hen pRec must al
a240: 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68  so be greater th
a250: 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e  an sample (i-1).
a260: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
a270: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
a280: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
a290: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  iCol;.        as
a2a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
a2b0: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a2c0: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
a2d0: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
a2e0: 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  <=0.            
a2f0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
a300: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a320: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i>0 ){.       
a330: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
a340: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20  nField;.        
a350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
a360: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
a370: 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c  (aSample[i-1].n,
a380: 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c   aSample[i-1].p,
a390: 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20   pRec)<0.       
a3a0: 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
a3b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
a3c0: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
a3d0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
a3e0: 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45   ifdef SQLITE_DE
a3f0: 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65  BUG */..  if( re
a400: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52  s==0 ){.    /* R
a410: 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65 71  ecord pRec is eq
a420: 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20  ual to sample i 
a430: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
a440: 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b  Col==nField-1 );
a450: 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
a460: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b  aSample[i].anLt[
a470: 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74  iCol];.    aStat
a480: 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [1] = aSample[i]
a490: 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d  .anEq[iCol];.  }
a4a0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20  else{.    /* At 
a4b0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
a4c0: 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70  (iCol+1) field p
a4d0: 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65  refix of aSample
a4e0: 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74  [i] is the first
a4f0: 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20   .    ** sample 
a500: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
a510: 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69  than pRec. Or, i
a520: 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  f i==pIdx->nSamp
a530: 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20  le then pRec.   
a540: 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68   ** is larger th
a550: 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69  an all samples i
a560: 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a  n the array. */.
a570: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
a580: 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66  er, iGap;.    if
a590: 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i>=pIdx->nSamp
a5a0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70  le ){.      iUpp
a5b0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  er = sqlite3LogE
a5c0: 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69  stToInt(pIdx->ai
a5d0: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20  RowLogEst[0]);. 
a5e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5f0: 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65  iUpper = aSample
a600: 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
a610: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
a620: 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b  Lower>=iUpper ){
a630: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b  .      iGap = 0;
a640: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a650: 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20    iGap = iUpper 
a660: 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a  - iLower;.    }.
a670: 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20      if( roundUp 
a680: 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  ){.      iGap = 
a690: 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20  (iGap*2)/3;.    
a6a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61  }else{.      iGa
a6b0: 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20  p = iGap/3;.    
a6c0: 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  }.    aStat[0] =
a6d0: 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a   iLower + iGap;.
a6e0: 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70      aStat[1] = p
a6f0: 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c  Idx->aAvgEq[iCol
a700: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  ];.  }..  /* Res
a710: 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e 6e  tore the pRec->n
a720: 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66 6f  Field value befo
a730: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a  re returning.  *
a740: 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  /.  pRec->nField
a750: 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74   = nField;.  ret
a760: 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn i;.}.#endif 
a770: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
a780: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
a790: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  */../*.** If it 
a7a0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65  is not NULL, pTe
a7b0: 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68 61  rm is a term tha
a7c0: 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70  t provides an up
a7d0: 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20  per or lower.** 
a7e0: 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65  bound on a range
a7f0: 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63   scan. Without c
a800: 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d  onsidering pTerm
a810: 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74 65  , it is estimate
a820: 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73  d .** that the s
a830: 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e  can will visit n
a840: 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66  New rows. This f
a850: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
a860: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73  the number.** es
a870: 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69  timated to be vi
a880: 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b 69  sited after taki
a890: 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63  ng pTerm into ac
a8a0: 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  count..**.** If 
a8b0: 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63 69  the user explici
a8c0: 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61 20  tly specified a 
a8d0: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c  likelihood() val
a8e0: 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  ue for this term
a8f0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
a900: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
a910: 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c  e likelihood mul
a920: 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e  tiplied by the n
a930: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75  umber of.** inpu
a940: 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73  t rows. Otherwis
a950: 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
a960: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e   assumes that an
a970: 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74   "IS NOT NULL" t
a980: 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b  erm.** has a lik
a990: 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c  elihood of 0.50,
a9a0: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74   and any other t
a9b0: 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  erm a likelihood
a9c0: 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61   of 0.25..*/.sta
a9d0: 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65  tic LogEst where
a9e0: 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72  RangeAdjust(Wher
a9f0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f  eTerm *pTerm, Lo
aa00: 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f  gEst nNew){.  Lo
aa10: 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77  gEst nRet = nNew
aa20: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
aa30: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
aa40: 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a  truthProb<=0 ){.
aa50: 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54        nRet += pT
aa60: 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
aa70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
aa80: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
aa90: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
aaa0: 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20  {.      nRet -= 
aab0: 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65 72  20;        asser
aac0: 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 20==sqlite3Lo
aad0: 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d  gEst(4) );.    }
aae0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52  .  }.  return nR
aaf0: 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  et;.}...#ifdef S
ab00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
ab10: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
ab20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 66 66  * Return the aff
ab30: 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69 6e 67  inity for a sing
ab40: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20  le column of an 
ab50: 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68 61 72 20 73  index..*/.char s
ab60: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
ab70: 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65  nAffinity(sqlite
ab80: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
ab90: 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  dx, int iCol){. 
aba0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
abb0: 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e   && iCol<pIdx->n
abc0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20  Column );.  if( 
abd0: 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29  !pIdx->zColAff )
abe0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
abf0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
ac00: 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29  r(db, pIdx)==0 )
ac10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
ac20: 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72  FF_BLOB;.  }.  r
ac30: 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c  eturn pIdx->zCol
ac40: 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e  Aff[iCol];.}.#en
ac50: 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  dif...#ifdef SQL
ac60: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
ac70: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a  _OR_STAT4./* .**
ac80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
ac90: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69  s called to esti
aca0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
acb0: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
acc0: 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63  by a.** range-sc
acd0: 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61  an on a skip-sca
ace0: 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61  n index. For exa
acf0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  mple:.**.**   CR
ad00: 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
ad10: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a   t1(a, b, c);.**
ad20: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
ad30: 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e   t1 WHERE a=? AN
ad40: 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  D c BETWEEN ? AN
ad50: 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65  D ?;.**.** Value
ad60: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20   pLoop->nOut is 
ad70: 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f  currently set to
ad80: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
ad90: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a  umber of rows .*
ada0: 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63  * visited for sc
adb0: 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20  anning (a=? AND 
adc0: 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74  b=?). This funct
add0: 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74  ion reduces that
ade0: 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79   estimate .** by
adf0: 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20   some factor to 
ae00: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
ae10: 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  (c BETWEEN ? AND
ae20: 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62   ?) expression b
ae30: 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ased.** on the s
ae40: 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68  tat4 data for th
ae50: 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63  e index. this sc
ae60: 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72  an will be pefor
ae70: 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  med multiple .**
ae80: 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72   times (once for
ae90: 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62   each (a,b) comb
aea0: 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74  ination that mat
aeb0: 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61  ches a=?) is dea
aec0: 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74  lt with .** by t
aed0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
aee0: 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79   It does this by
aef0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
af00: 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70  h all stat4 samp
af10: 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76  les, comparing v
af20: 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74  alues.** extract
af30: 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61  ed from pLower a
af40: 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74  nd pUpper with t
af50: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
af60: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a   column in each.
af70: 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20  ** sample. If L 
af80: 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75  and U are the nu
af90: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
afa0: 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73  found to be less
afb0: 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61   than or.** equa
afc0: 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20  l to the values 
afd0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
afe0: 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
aff0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61   respectively, a
b000: 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74  nd.** N is the t
b010: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
b020: 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f  amples, the pLoo
b030: 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73  p->nOut value is
b040: 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20   adjusted.** as 
b050: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
b060: 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28   nOut = nOut * (
b070: 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f   min(U - L, 1) /
b080: 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c   N ).**.** If pL
b090: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  ower is NULL, or
b0a0: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
b0b0: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
b0c0: 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73  m the term, L is
b0d0: 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  .** set to zero.
b0e0: 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55   If pUpper is NU
b0f0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
b100: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
b110: 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55  ed from it,.** U
b120: 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a   is set to N..**
b130: 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  .** Normally, th
b140: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
b150: 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65   *pbDone to 1 be
b160: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
b170: 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e  However,.** if n
b180: 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65  o value can be e
b190: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69  xtracted from ei
b1a0: 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70  ther pLower or p
b1b0: 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68  Upper (and so th
b1c0: 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66  e.** estimate of
b1d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b1e0: 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65  ows delivered re
b1f0: 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29  mains unchanged)
b200: 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20  , *pbDone.** is 
b210: 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a  left as is..**.*
b220: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
b230: 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
b240: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
b250: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
b260: 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  e, .** SQLITE_OK
b270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b280: 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63  whereRangeSkipSc
b290: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
b2a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
b2b0: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
b2c0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
b2d0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
b2e0: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
b2f0: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
b300: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
b310: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
b320: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
b330: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
b340: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
b350: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
b360: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
b370: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
b380: 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f  oop *pLoop,    /
b390: 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f  * Update the .nO
b3a0: 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ut value of this
b3b0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a   loop */.  int *
b3c0: 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  pbDone          
b3d0: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
b3e0: 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65  f at least one e
b3f0: 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61  xpr. value extra
b400: 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  cted */.){.  Ind
b410: 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
b420: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
b430: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
b440: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
b450: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b460: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
b470: 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20   nLower = -1;.  
b480: 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e  int nUpper = p->
b490: 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74  nSample+1;.  int
b4a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b4b0: 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69  .  u8 aff = sqli
b4c0: 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66  te3IndexColumnAf
b4d0: 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45  finity(db, p, nE
b4e0: 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  q);.  CollSeq *p
b4f0: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74  Coll;.  .  sqlit
b500: 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30  e3_value *p1 = 0
b510: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ;          /* Va
b520: 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
b530: 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73  om pLower */.  s
b540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32  qlite3_value *p2
b550: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
b560: 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
b570: 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f  d from pUpper */
b580: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b590: 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20   *pVal = 0;     
b5a0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
b5b0: 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72  acted from recor
b5c0: 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  d */..  pColl = 
b5d0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
b5e0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
b5f0: 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20  azColl[nEq]);.  
b600: 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
b610: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
b620: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
b630: 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d  (pParse, pLower-
b640: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
b650: 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e  aff, &p1);.    n
b660: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  Lower = 0;.  }. 
b670: 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72   if( pUpper && r
b680: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b6a0: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
b6b0: 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65  pr(pParse, pUppe
b6c0: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
b6d0: 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20  , aff, &p2);.   
b6e0: 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30   nUpper = p2 ? 0
b6f0: 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20   : p->nSample;. 
b700: 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20   }..  if( p1 || 
b710: 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  p2 ){.    int i;
b720: 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a  .    int nDiff;.
b730: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
b740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
b750: 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  p->nSample; i++)
b760: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
b770: 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28  ite3Stat4Column(
b780: 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  db, p->aSample[i
b790: 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ].p, p->aSample[
b7a0: 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c  i].n, nEq, &pVal
b7b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
b7c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31  =SQLITE_OK && p1
b7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b7e0: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
b7f0: 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c  Compare(p1, pVal
b800: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
b810: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
b820: 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Lower++;.      }
b830: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b840: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29  QLITE_OK && p2 )
b850: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
b860: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
b870: 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20  mpare(p2, pVal, 
b880: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
b890: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70  if( res>=0 ) nUp
b8a0: 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  per++;.      }. 
b8b0: 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d     }.    nDiff =
b8c0: 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65   (nUpper - nLowe
b8d0: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66  r);.    if( nDif
b8e0: 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31  f<=0 ) nDiff = 1
b8f0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
b900: 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
b910: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  per and lower bo
b920: 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61  und specified, a
b930: 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  nd the .    ** c
b940: 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63  omparisons indic
b950: 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72  ate that they ar
b960: 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72  e close together
b970: 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61  , use the fallba
b980: 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ck.    ** method
b990: 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68   (assume that th
b9a0: 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f  e scan visits 1/
b9b0: 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20  64 of the rows) 
b9c0: 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20  for estimating. 
b9d0: 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
b9e0: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
b9f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74  . Otherwise, est
ba00: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
ba10: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20   of rows.    ** 
ba20: 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64  using the method
ba30: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
ba40: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
ba50: 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
ba60: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  on. */.    if( n
ba70: 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65  Diff!=1 || pUppe
ba80: 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d  r==0 || pLower==
ba90: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
baa0: 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65  Adjust = (sqlite
bab0: 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70  3LogEst(p->nSamp
bac0: 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67  le) - sqlite3Log
bad0: 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20  Est(nDiff));.   
bae0: 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d     pLoop->nOut -
baf0: 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20  = nAdjust;.     
bb00: 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20   *pbDone = 1;.  
bb10: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
bb20: 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69  x10, ("range ski
bb30: 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  p-scan regions: 
bb40: 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25  %u..%u  adjust=%
bb50: 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  d est=%d\n",.   
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20          nLower, 
bb80: 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a  nUpper, nAdjust*
bb90: 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29  -1, pLoop->nOut)
bba0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  );.    }..  }els
bbb0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  e{.    assert( *
bbc0: 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d  pbDone==0 );.  }
bbd0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
bbe0: 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69  Free(p1);.  sqli
bbf0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29  te3ValueFree(p2)
bc00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
bc10: 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
bc20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
bc30: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
bc40: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
bc50: 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  T4 */../*.** Thi
bc60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
bc70: 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
bc80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
bc90: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
bca0: 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
bcb0: 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
bcc0: 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
bcd0: 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
bce0: 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
bcf0: 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
bd00: 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
bd10: 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
bd20: 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
bd30: 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
bd40: 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
bd50: 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
bd60: 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
bd70: 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
bd80: 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
bd90: 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
bda0: 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
bdb0: 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
bdc0: 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
bdd0: 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
bde0: 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
be00: 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
be30: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
be40: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
be50: 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
be60: 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
be70: 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
be80: 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
be90: 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
bea0: 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
beb0: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
bec0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
bed0: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
bee0: 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c   value in (pBuil
bef0: 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
bf00: 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e  ee.nEq) is the n
bf10: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
bf20: 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62  ex.** column sub
bf30: 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67  ject to the rang
bf40: 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
bf50: 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
bf60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
bf70: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
bf80: 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20  aints optimized 
bf90: 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
bfa0: 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
bfb0: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75  example,.** assu
bfc0: 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20  ming index p is 
bfd0: 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
bfe0: 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
bff0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
c000: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
c010: 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
c020: 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
c030: 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
c040: 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61   to 1 (as the ra
c050: 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63  nge restricted c
c060: 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65  olumn, b, is the
c070: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74   second .** left
c080: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
c090: 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
c0a0: 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
c0b0: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
c0c0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
c0d0: 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
c0e0: 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
c0f0: 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a   set to 0..**.**
c100: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
c110: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
c120: 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  pnOut is set to 
c130: 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  the sqlite3LogEs
c140: 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  t() of the.** nu
c150: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
c160: 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  t the index scan
c170: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
c180: 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a  visit without .*
c190: 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68  * considering th
c1a0: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
c1b0: 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30  nts. If nEq is 0
c1c0: 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73  , then *pnOut is
c1d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
c1e0: 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  ** rows in the i
c1f0: 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e  ndex. Assuming n
c200: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
c210: 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74  *pnOut is adjust
c220: 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20  ed (reduced).** 
c230: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
c240: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
c250: 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20  ints pLower and 
c260: 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49  pUpper..** .** I
c270: 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
c280: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e   sqlite_stat4 AN
c290: 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69  ALYZE data, or i
c2a0: 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e  f such data cann
c2b0: 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61  ot be.** used, a
c2c0: 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e   single range in
c2d0: 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
c2e0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
c2f0: 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
c300: 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61   4. .** and a pa
c310: 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ir of constraint
c320: 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  s (x>? AND x<?) 
c330: 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65  reduces the expe
c340: 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  cted number of.*
c350: 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  * rows visited b
c360: 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34  y a factor of 64
c370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c380: 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
c390: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c3a0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
c3b0: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
c3c0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
c3d0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
c3e0: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
c3f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
c400: 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
c410: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
c420: 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
c430: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c440: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
c450: 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
c460: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
c470: 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
c480: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c490: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
c4a0: 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69  Loop     /* Modi
c4b0: 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64  fy the .nOut and
c4c0: 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65   maybe .rRun fie
c4d0: 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lds */.){.  int 
c4e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c4f0: 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f    int nOut = pLo
c500: 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45  op->nOut;.  LogE
c510: 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66  st nNew;..#ifdef
c520: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c530: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
c540: 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
c550: 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
c560: 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
c570: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
c580: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  ;..  if( p->nSam
c590: 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e  ple>0 && nEq<p->
c5a0: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20  nSampleCol ){.  
c5b0: 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
c5c0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
c5d0: 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64  {.      Unpacked
c5e0: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
c5f0: 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
c600: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32       tRowcnt a[2
c610: 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 74  ];.      int nBt
c620: 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  m = pLoop->u.btr
c630: 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69  ee.nBtm;.      i
c640: 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d  nt nTop = pLoop-
c650: 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a  >u.btree.nTop;..
c660: 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c        /* Variabl
c670: 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65  e iLower will be
c680: 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
c690: 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
c6a0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20  er of rows in . 
c6b0: 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65       ** the inde
c6c0: 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20  x that are less 
c6d0: 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62  than the lower b
c6e0: 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67  ound of the rang
c6f0: 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20  e query. The.   
c700: 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e     ** lower boun
c710: 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63  d being the conc
c720: 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20  atenation of $P 
c730: 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50  and $L, where $P
c740: 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
c750: 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d   key-prefix form
c760: 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61  ed by the nEq va
c770: 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61  lues matched aga
c780: 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66  inst the nEq lef
c790: 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  t-most.      ** 
c7a0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
c7b0: 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20  ndex, and $L is 
c7c0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f  the value in pLo
c7d0: 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  wer..      **.  
c7e0: 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c      ** Or, if pL
c7f0: 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20  ower is NULL or 
c800: 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  $L cannot be ext
c810: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28  racted from it (
c820: 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
c830: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d   ** is not a sim
c840: 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20  ple variable or 
c850: 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20  literal value), 
c860: 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20  the lower bound 
c870: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
c880: 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65  range is $P. Due
c890: 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74   to a quirk in t
c8a0: 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53  he way whereKeyS
c8b0: 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76  tats() works, ev
c8c0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24  en.      ** if $
c8d0: 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  L is available, 
c8e0: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20  whereKeyStats() 
c8f0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f  is called for bo
c900: 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20  th ($P) and .   
c910: 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e     ** ($P:$L) an
c920: 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  d the larger of 
c930: 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64  the two returned
c940: 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e   values is used.
c950: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c960: 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55  ** Similarly, iU
c970: 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65  pper is to be se
c980: 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  t to the estimat
c990: 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
c9a0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
c9b0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
c9c0: 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  pper bound of th
c9d0: 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57  e range query. W
c9e0: 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62  here the upper b
c9f0: 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  ound.      ** is
ca00: 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20   either ($P) or 
ca10: 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20  ($P:$U). Again, 
ca20: 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76  even if $U is av
ca30: 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61  ailable, both va
ca40: 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  lues.      ** of
ca50: 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75   iUpper are requ
ca60: 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65  ested of whereKe
ca70: 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65  yStats() and the
ca80: 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20   smaller used.. 
ca90: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
caa0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   The number of r
cab0: 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ows between the 
cac0: 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68  two bounds is th
cad0: 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69  en just iUpper-i
cae0: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  Lower..      */.
caf0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c        tRowcnt iL
cb00: 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  ower;     /* Row
cb10: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
cb20: 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  lower bound */. 
cb30: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70       tRowcnt iUp
cb40: 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  per;     /* Rows
cb50: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75   less than the u
cb60: 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  pper bound */.  
cb70: 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20      int iLwrIdx 
cb80: 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -2;   /* aSamp
cb90: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77  le[] for the low
cba0: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
cbb0: 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20    int iUprIdx = 
cbc0: 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65  -1;   /* aSample
cbd0: 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65 72  [] for the upper
cbe0: 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20   bound */..     
cbf0: 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20   if( pRec ){.   
cc00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
cc10: 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75  Rec->nField!=pBu
cc20: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
cc30: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63   );.        pRec
cc40: 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c  ->nField = pBuil
cc50: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
cc60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
cc70: 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65   Determine iLowe
cc80: 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69  r and iUpper usi
cc90: 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f  ng ($P) only. */
cca0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  .      if( nEq==
ccb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f  0 ){.        iLo
ccc0: 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wer = 0;.       
ccd0: 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f   iUpper = p->nRo
cce0: 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c  wEst0;.      }el
ccf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
cd00: 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63  ote: this call c
cd10: 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65  ould be optimize
cd20: 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74  d away - since t
cd30: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d  he same values m
cd40: 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ust .        ** 
cd50: 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
cd60: 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
cd70: 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
cd80: 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
cd90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72   */.        wher
cda0: 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
cdb0: 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
cdc0: 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  ;.        iLower
cdd0: 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20   = a[0];.       
cde0: 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b   iUpper = a[0] +
cdf0: 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a   a[1];.      }..
ce00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
ce10: 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77  ower==0 || (pLow
ce20: 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
ce30: 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d  (WO_GT|WO_GE))!=
ce40: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
ce50: 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  t( pUpper==0 || 
ce60: 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
ce70: 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
ce80: 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
ce90: 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74  assert( p->aSort
cea0: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
ceb0: 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72    if( p->aSortOr
cec0: 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20  der[nEq] ){.    
ced0: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73      /* The roles
cee0: 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   of pLower and p
cef0: 55 70 70 65 72 20 61 72 65 20 73 77 61 70 70 65  Upper are swappe
cf00: 64 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64  d for a DESC ind
cf10: 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57  ex */.        SW
cf20: 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70  AP(WhereTerm*, p
cf30: 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a  Lower, pUpper);.
cf40: 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74          SWAP(int
cf50: 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20  , nBtm, nTop);. 
cf60: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
cf70: 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
cf80: 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f  prove on the iLo
cf90: 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  wer estimate usi
cfa0: 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20  ng ($P:$L). */. 
cfb0: 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20       if( pLower 
cfc0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
cfd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cfe0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65       /* Values e
cff0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
d000: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
d010: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f  xpr *pExpr = pLo
d020: 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
d030: 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
d040: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
d050: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
d060: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
d070: 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26  pr, nBtm, nEq, &
d080: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
d090: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d0a0: 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   n ){.          
d0b0: 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
d0c0: 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b          u16 mask
d0d0: 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a   = WO_GT|WO_LE;.
d0e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
d0f0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
d100: 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d  ize(pExpr)>n ) m
d110: 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f  ask = (WO_LE|WO_
d120: 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  LT);.          i
d130: 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  LwrIdx = whereKe
d140: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
d150: 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
d160: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
d170: 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d  a[0] + ((pLower-
d180: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73  >eOperator & mas
d190: 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  k) ? a[1] : 0);.
d1a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
d1b0: 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77  ew>iLower ) iLow
d1c0: 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
d1d0: 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
d1e0: 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20         pLower = 
d1f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
d200: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
d210: 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
d220: 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65  ove on the iUppe
d230: 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
d240: 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20   ($P:$U). */.   
d250: 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b     if( pUpper ){
d260: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20  .        int n; 
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74     /* Values ext
d290: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
d2a0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
d2b0: 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65  r *pExpr = pUppe
d2c0: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
d2d0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
d2e0: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
d2f0: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
d300: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
d310: 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29  , nTop, nEq, &n)
d320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
d330: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
d340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52   ){.          tR
d350: 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
d360: 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d        u16 mask =
d370: 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_GT|WO_LE;.  
d380: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
d390: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
d3a0: 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73  e(pExpr)>n ) mas
d3b0: 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54  k = (WO_LE|WO_LT
d3c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55 70  );.          iUp
d3d0: 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53  rIdx = whereKeyS
d3e0: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
d3f0: 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20  pRec, 1, a);.   
d400: 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
d410: 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65  0] + ((pUpper->e
d420: 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29  Operator & mask)
d430: 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
d440: 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
d450: 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72  <iUpper ) iUpper
d460: 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
d470: 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
d480: 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b       pUpper = 0;
d490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d4a0: 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64   }..      pBuild
d4b0: 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
d4c0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
d4d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d4e0: 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
d4f0: 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
d500: 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65     nNew = sqlite
d510: 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d  3LogEst(iUpper -
d520: 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20   iLower);.      
d530: 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20      /* TUNING:  
d540: 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61  If both iUpper a
d550: 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65  nd iLower are de
d560: 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73  rived from the s
d570: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
d580: 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73   sample, then as
d590: 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78  sume they are 4x
d5a0: 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e   more selective.
d5b0: 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20    This brings.  
d5c0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
d5d0: 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69  stimated selecti
d5e0: 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e  vity more in lin
d5f0: 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77  e with what it w
d600: 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20  ould be.        
d610: 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65    ** if estimate
d620: 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73  d without the us
d630: 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62  e of STAT3/4 tab
d640: 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  les. */.        
d650: 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69    if( iLwrIdx==i
d660: 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d  UprIdx ) nNew -=
d670: 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
d680: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
d690: 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  4) );.        }e
d6a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  lse{.          n
d6b0: 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20  New = 10;       
d6c0: 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
d6d0: 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
d6e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d6f0: 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74     if( nNew<nOut
d700: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
d710: 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
d720: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45     }.        WHE
d730: 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22  RETRACE(0x10, ("
d740: 53 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e  STAT4 range scan
d750: 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
d760: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33  (u32)iLower, (u3
d790: 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29  2)iUpper, nOut))
d7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d7b0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
d7c0: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Done = 0;.      
d7d0: 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53  rc = whereRangeS
d7e0: 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73  kipScanEst(pPars
d7f0: 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65  e, pLower, pUppe
d800: 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65  r, pLoop, &bDone
d810: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f  );.      if( bDo
d820: 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  ne ) return rc;.
d830: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
d840: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d850: 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e  ER(pParse);.  UN
d860: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d870: 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65  Builder);.  asse
d880: 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55  rt( pLower || pU
d890: 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20  pper );.#endif. 
d8a0: 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d   assert( pUpper=
d8b0: 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77  =0 || (pUpper->w
d8c0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
d8d0: 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65  ULL)==0 );.  nNe
d8e0: 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64  w = whereRangeAd
d8f0: 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75  just(pLower, nOu
d900: 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65  t);.  nNew = whe
d910: 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55  reRangeAdjust(pU
d920: 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20  pper, nNew);..  
d930: 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
d940: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
d950: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c  pper and lower l
d960: 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72  imit and neither
d970: 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20   limit.  ** has 
d980: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64  an application-d
d990: 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f  efined likelihoo
d9a0: 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20  d(), assume the 
d9b0: 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65  range is.  ** re
d9c0: 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69  duced by an addi
d9d0: 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73  tional 75%. This
d9e0: 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20   means that, by 
d9f0: 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e  default, an open
da00: 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67  -ended.  ** rang
da10: 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f  e query (e.g. co
da20: 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65  l > ?) is assume
da30: 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f  d to match 1/4 o
da40: 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  f the rows in th
da50: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68  e.  ** index. Wh
da60: 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e  ile a closed ran
da70: 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54  ge (e.g. col BET
da80: 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73  WEEN ? AND ?) is
da90: 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20   estimated to.  
daa0: 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66  ** match 1/64 of
dab0: 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a   the index. */ .
dac0: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
dad0: 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f  pLower->truthPro
dae0: 62 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26  b>0 && pUpper &&
daf0: 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72   pUpper->truthPr
db00: 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77  ob>0 ){.    nNew
db10: 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e   -= 20;.  }..  n
db20: 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d  Out -= (pLower!=
db30: 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29  0) + (pUpper!=0)
db40: 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  ;.  if( nNew<10 
db50: 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
db60: 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
db70: 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20  Out = nNew;.#if 
db80: 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
db90: 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66  CE_ENABLED).  if
dba0: 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f  ( pLoop->nOut>nO
dbb0: 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54  ut ){.    WHERET
dbc0: 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67  RACE(0x10,("Rang
dbd0: 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f  e scan lowers nO
dbe0: 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  ut from %d to %d
dbf0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
dc00: 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
dc10: 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  nOut, nOut));.  
dc20: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70  }.#endif.  pLoop
dc30: 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
dc40: 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20  )nOut;.  return 
dc50: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
dc60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
dc70: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
dc80: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
dc90: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
dca0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
dcb0: 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
dcc0: 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  n equality const
dcd0: 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e  raint x=VALUE an
dce0: 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c  d where that VAL
dcf0: 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20  UE occurs in.** 
dd00: 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61  the histogram da
dd10: 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77  ta.  This only w
dd20: 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74  orks when x is t
dd30: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
dd40: 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64  column of an ind
dd50: 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  ex and sqlite_st
dd60: 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
dd70: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a  ta is available.
dd80: 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65  ** for that inde
dd90: 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d  x.  When pExpr==
dda0: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
ddb0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
ddc0: 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22  s.** "x IS NULL"
ddd0: 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56   instead of "x=V
dde0: 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  ALUE"..**.** Wri
ddf0: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
de00: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
de10: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
de20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
de30: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
de40: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
de50: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
de60: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
de70: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
de80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
de90: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
dea0: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
deb0: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
dec0: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
ded0: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
dee0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
def0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
df00: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
df10: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
df20: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
df30: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
df40: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
df50: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
df60: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
df70: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
df80: 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20  EqualScanEst(.  
df90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
dfa0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
dfb0: 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
dfc0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
dfd0: 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
dfe0: 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
dff0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
e000: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
e010: 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65  for VALUE in the
e020: 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61   x=VALUE constra
e030: 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  int */.  tRowcnt
e040: 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
e050: 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
e060: 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
e070: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
e080: 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72  ex *p = pBuilder
e090: 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
e0a0: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
e0b0: 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  q = pBuilder->pN
e0c0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
e0d0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
e0e0: 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
e0f0: 65 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20  er->pRec;.  int 
e100: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
e110: 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63        /* Subfunc
e120: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
e130: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b   */.  tRowcnt a[
e140: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
e150: 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f  /* Statistics */
e160: 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61  .  int bOk;..  a
e170: 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b  ssert( nEq>=1 );
e180: 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d  .  assert( nEq<=
e190: 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  p->nColumn );.  
e1a0: 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
e1b0: 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
e1c0: 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20  t( p->nSample>0 
e1d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  );.  assert( pBu
e1e0: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
e1f0: 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  <nEq );..  /* If
e200: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
e210: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
e220: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
e230: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66  index to the lef
e240: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f  t.  ** of this o
e250: 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20  ne, no estimate 
e260: 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74  can be made. Ret
e270: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
e280: 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42  UND. */.  if( pB
e290: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e2a0: 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20  d<(nEq-1) ){.   
e2b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e2c0: 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20  OTFOUND;.  }..  
e2d0: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  /* This is an op
e2e0: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
e2f0: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
e300: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
e310: 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65  tValue().  ** be
e320: 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  low would return
e330: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
e340: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d    */.  if( nEq>=
e350: 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  p->nColumn ){.  
e360: 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20    *pnRow = 1;.  
e370: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e380: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
e390: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
e3a0: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
e3b0: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
e3c0: 72 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f  r, 1, nEq-1, &bO
e3d0: 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e  k);.  pBuilder->
e3e0: 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69  pRec = pRec;.  i
e3f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e400: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e410: 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74  if( bOk==0 ) ret
e420: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
e430: 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  UND;.  pBuilder-
e440: 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71  >nRecValid = nEq
e450: 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61  ;..  whereKeySta
e460: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
e470: 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45  ec, 0, a);.  WHE
e480: 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 65  RETRACE(0x10,("e
e490: 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
e4a0: 69 6f 6e 73 20 25 73 28 25 64 29 3a 20 25 64 5c  ions %s(%d): %d\
e4b0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
e4c0: 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c         p->zName,
e4d0: 20 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31   nEq-1, (int)a[1
e4e0: 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20  ]));.  *pnRow = 
e4f0: 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72  a[1];.  .  retur
e500: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e510: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
e520: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
e530: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
e540: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
e550: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
e560: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
e570: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
e580: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
e590: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
e5a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
e5b0: 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
e5c0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
e5d0: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
e5e0: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
e5f0: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
e600: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
e610: 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
e620: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
e630: 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
e640: 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
e650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e660: 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
e670: 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
e680: 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
e690: 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
e6a0: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
e6b0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
e6c0: 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
e6d0: 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
e6e0: 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
e6f0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
e700: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
e710: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
e720: 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
e730: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
e740: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
e750: 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
e760: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
e770: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
e780: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
e790: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
e7a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
e7b0: 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
e7c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e7d0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
e7e0: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
e7f0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
e800: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
e810: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
e820: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
e830: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
e840: 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
e850: 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
e860: 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
e870: 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
e880: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
e890: 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
e8a0: 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
e8b0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
e8c0: 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
e8d0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
e8e0: 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c   i64 nRow0 = sql
e8f0: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
e900: 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  p->aiRowLogEst[0
e910: 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61  ]);.  int nRecVa
e920: 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
e930: 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74  nRecValid;.  int
e940: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e950: 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
e960: 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
e970: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73  */.  tRowcnt nEs
e980: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
e990: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66  Number of rows f
e9a0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  or a single term
e9b0: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52   */.  tRowcnt nR
e9c0: 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  owEst = 0;    /*
e9d0: 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
e9e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e9f0: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ows */.  int i; 
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
ea20: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
ea30: 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
ea40: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
ea50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
ea60: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
ea70: 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f  {.    nEst = nRo
ea80: 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  w0;.    rc = whe
ea90: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
eaa0: 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
eab0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
eac0: 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
ead0: 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
eae0: 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
eaf0: 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
eb00: 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  alid;.  }..  if(
eb10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
eb20: 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  {.    if( nRowEs
eb30: 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77  t > nRow0 ) nRow
eb40: 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20  Est = nRow0;.   
eb50: 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
eb60: 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  t;.    WHERETRAC
eb70: 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20  E(0x10,("IN row 
eb80: 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64  estimate: est=%d
eb90: 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
eba0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
ebb0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
ebc0: 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a  d==nRecValid );.
ebd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ebe0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ebf0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
ec00: 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65  STAT4 */...#ifde
ec10: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
ec20: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
ec30: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
ec40: 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  a WhereTerm obje
ec50: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
ec60: 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74  d whereTermPrint
ec70: 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72  (WhereTerm *pTer
ec80: 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20  m, int iTerm){. 
ec90: 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
eca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
ecb0: 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d  gPrintf("TERM-%-
ecc0: 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72  3d NULL\n", iTer
ecd0: 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
ece0: 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a   char zType[4];.
ecf0: 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74 5b 35      char zLeft[5
ed00: 30 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  0];.    memcpy(z
ed10: 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b  Type, "...", 4);
ed20: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
ed30: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
ed40: 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30  IRTUAL ) zType[0
ed50: 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28  ] = 'V';.    if(
ed60: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
ed70: 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20  r & WO_EQUIV  ) 
ed80: 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a  zType[1] = 'E';.
ed90: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
eda0: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
edb0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
edc0: 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20  n) ) zType[2] = 
edd0: 27 4c 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65  'L';.    if( pTe
ede0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
edf0: 57 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20  WO_SINGLE ){.   
ee00: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
ee10: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74  ntf(sizeof(zLeft
ee20: 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25  ),zLeft,"left={%
ee30: 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20  d:%d}",.        
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ee50: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ee60: 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  , pTerm->u.leftC
ee70: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
ee80: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f  e if( (pTerm->eO
ee90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
eea0: 21 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e  !=0 && pTerm->u.
eeb0: 70 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20  pOrInfo!=0 ){.  
eec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
eed0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66  intf(sizeof(zLef
eee0: 74 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61  t),zLeft,"indexa
eef0: 62 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20  ble=0x%lld", .  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f       pTerm->u.pO
ef20: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
ef30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ef40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ef50: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66  intf(sizeof(zLef
ef60: 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25  t),zLeft,"left=%
ef70: 64 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  d", pTerm->leftC
ef80: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
ef90: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
efa0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 54 45  intf(.       "TE
efb0: 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20 25 2d  RM-%-3d %p %s %-
efc0: 31 32 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70  12s prob=%-3d op
efd0: 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73 3d  =0x%03x wtFlags=
efe0: 30 78 25 30 34 78 22 2c 0a 20 20 20 20 20 20 20  0x%04x",.       
eff0: 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54  iTerm, pTerm, zT
f000: 79 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72  ype, zLeft, pTer
f010: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20  m->truthProb,.  
f020: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
f030: 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74  rator, pTerm->wt
f040: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
f050: 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b  pTerm->iField ){
f060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
f070: 62 75 67 50 72 69 6e 74 66 28 22 20 69 46 69 65  bugPrintf(" iFie
f080: 6c 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d  ld=%d\n", pTerm-
f090: 3e 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65  >iField);.    }e
f0a0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
f0b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
f0c0: 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n");.    }.    s
f0d0: 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
f0e0: 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78  pr(0, pTerm->pEx
f0f0: 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pr, 0);.  }.}.#e
f100: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45  ndif..#ifdef WHE
f110: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f120: 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63  /*.** Show the c
f130: 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
f140: 6f 66 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  of a WhereClause
f150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f160: 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74  WhereClausePrint
f170: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
f180: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  C){.  int i;.  f
f190: 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e  or(i=0; i<pWC->n
f1a0: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
f1b0: 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26  whereTermPrint(&
f1c0: 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20  pWC->a[i], i);. 
f1d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
f1e0: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
f1f0: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
f200: 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  nt a WhereLoop o
f210: 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67  bject for debugg
f220: 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a  ing purposes.*/.
f230: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f240: 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65  eLoopPrint(Where
f250: 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c  Loop *p, WhereCl
f260: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68  ause *pWC){.  Wh
f270: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
f280: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
f290: 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49   int nb = 1+(pWI
f2a0: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
f2b0: 53 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75  Src+3)/4;.  stru
f2c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
f2d0: 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d  *pItem = pWInfo-
f2e0: 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
f2f0: 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20  ->iTab;.  Table 
f300: 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
f310: 54 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  Tab;.  Bitmask m
f320: 41 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61 73 6b  All = (((Bitmask
f330: 29 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31  )1)<<(nb*4)) - 1
f340: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
f350: 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30  Printf("%c%2d.%0
f360: 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
f370: 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
f380: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
f390: 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
f3a0: 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
f3b0: 65 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71  eq & mAll);.  sq
f3c0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f3d0: 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20  (" %12s",.      
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f3f0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70  Item->zAlias ? p
f400: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70  Item->zAlias : p
f410: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
f420: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
f430: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
f440: 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  BLE)==0 ){.    c
f450: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
f460: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62  ;.    if( p->u.b
f470: 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28  tree.pIndex && (
f480: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72  zName = p->u.btr
f490: 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
f4a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
f4b0: 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c  ( strncmp(zName,
f4c0: 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
f4d0: 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  ex_", 17)==0 ){.
f4e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
f4f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f500: 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20  zName) - 1;.    
f510: 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
f520: 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a  [i]!='_' ) i--;.
f530: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d          zName +=
f540: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
f550: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f560: 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64  intf(".%-16s %2d
f570: 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62  ", zName, p->u.b
f580: 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d  tree.nEq);.    }
f590: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
f5a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f5b0: 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d  %20s","");.    }
f5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
f5d0: 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70  ar *z;.    if( p
f5e0: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
f5f0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
f600: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
f610: 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20  d,\"%s\",%x)",. 
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f630: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
f640: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
f650: 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  r, p->u.vtab.omi
f660: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  tMask);.    }els
f670: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
f680: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25  ite3_mprintf("(%
f690: 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61  d,%x)", p->u.vta
f6a0: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
f6b0: 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20  tab.omitMask);. 
f6c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f6d0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d  DebugPrintf(" %-
f6e0: 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71  19s", z);.    sq
f6f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
f700: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c   }.  if( p->wsFl
f710: 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50  ags & WHERE_SKIP
f720: 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  SCAN ){.    sqli
f730: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f740: 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20   f %05x %d-%d", 
f750: 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e  p->wsFlags, p->n
f760: 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b  LTerm,p->nSkip);
f770: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
f780: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f790: 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c  (" f %05x N %d",
f7a0: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
f7b0: 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73  nLTerm);.  }.  s
f7c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f7d0: 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25  f(" cost %d,%d,%
f7e0: 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c  d\n", p->rSetup,
f7f0: 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
f800: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54  t);.  if( p->nLT
f810: 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57  erm && (sqlite3W
f820: 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
f830: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  0)!=0 ){.    int
f840: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
f850: 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b   i<p->nLTerm; i+
f860: 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54  +){.      whereT
f870: 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65  ermPrint(p->aLTe
f880: 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d  rm[i], i);.    }
f890: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
f8a0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c  *.** Convert bul
f8b0: 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20  k memory into a 
f8c0: 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20  valid WhereLoop 
f8d0: 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73 73  that can be pass
f8e0: 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f  ed.** to whereLo
f8f0: 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73  opClear harmless
f900: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
f910: 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  id whereLoopInit
f920: 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a  (WhereLoop *p){.
f930: 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d    p->aLTerm = p-
f940: 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20  >aLTermSpace;.  
f950: 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  p->nLTerm = 0;. 
f960: 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72   p->nLSlot = Arr
f970: 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d  aySize(p->aLTerm
f980: 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46  Space);.  p->wsF
f990: 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lags = 0;.}../*.
f9a0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68 65  ** Clear the Whe
f9b0: 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20  reLoop.u union. 
f9c0: 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70   Leave WhereLoop
f9d0: 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a  .pLTerm intact..
f9e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f9f0: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
fa00: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
fa10: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
fa20: 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
fa30: 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c  & (WHERE_VIRTUAL
fa40: 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f  TABLE|WHERE_AUTO
fa50: 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69  _INDEX) ){.    i
fa60: 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
fa70: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
fa80: 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  BLE)!=0 && p->u.
fa90: 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b  vtab.needFree ){
faa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
fab0: 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64  ree(p->u.vtab.id
fac0: 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xStr);.      p->
fad0: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
fae0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  = 0;.      p->u.
faf0: 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b  vtab.idxStr = 0;
fb00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
fb10: 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
fb20: 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
fb30: 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e  0 && p->u.btree.
fb40: 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
fb50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fb60: 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  (db, p->u.btree.
fb70: 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29  pIndex->zColAff)
fb80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
fb90: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62  bFree(db, p->u.b
fba0: 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20  tree.pIndex);.  
fbb0: 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
fbc0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
fbd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
fbe0: 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61  allocate interna
fbf0: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
fc00: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
fc10: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
fc20: 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
fc30: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
fc40: 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
fc50: 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
fc60: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
fc70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
fc80: 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
fc90: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
fca0: 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20 77 68  ion(db, p);.  wh
fcb0: 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a  ereLoopInit(p);.
fcc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  }../*.** Increas
fcd0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
fce0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f  ocation for pLoo
fcf0: 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62  p->aLTerm[] to b
fd00: 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f  e at least n..*/
fd10: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
fd20: 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71 6c 69  eLoopResize(sqli
fd30: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
fd40: 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20  op *p, int n){. 
fd50: 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e   WhereTerm **paN
fd60: 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53  ew;.  if( p->nLS
fd70: 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20  lot>=n ) return 
fd80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d  SQLITE_OK;.  n =
fd90: 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e   (n+7)&~7;.  paN
fda0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
fdb0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
fdc0: 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
fdd0: 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e  ])*n);.  if( paN
fde0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
fdf0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
fe00: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77  ;.  memcpy(paNew
fe10: 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a  , p->aLTerm, siz
fe20: 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  eof(p->aLTerm[0]
fe30: 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20  )*p->nLSlot);.  
fe40: 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
fe50: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
fe60: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
fe70: 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20  , p->aLTerm);.  
fe80: 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65  p->aLTerm = paNe
fe90: 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d  w;.  p->nLSlot =
fea0: 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   n;.  return SQL
feb0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
fec0: 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e   Transfer conten
fed0: 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  t from the secon
fee0: 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  d pLoop into the
fef0: 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69   first..*/.stati
ff00: 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58  c int whereLoopX
ff10: 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fer(sqlite3 *db,
ff20: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c   WhereLoop *pTo,
ff30: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f   WhereLoop *pFro
ff40: 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m){.  whereLoopC
ff50: 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54  learUnion(db, pT
ff60: 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  o);.  if( whereL
ff70: 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 54  oopResize(db, pT
ff80: 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d  o, pFrom->nLTerm
ff90: 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ) ){.    memset(
ffa0: 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  &pTo->u, 0, size
ffb0: 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20  of(pTo->u));.   
ffc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ffd0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
ffe0: 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
fff0: 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  om, WHERE_LOOP_X
10000 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70  FER_SZ);.  memcp
10010 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70  y(pTo->aLTerm, p
10020 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54  From->aLTerm, pT
10030 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66  o->nLTerm*sizeof
10040 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  (pTo->aLTerm[0])
10050 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
10060 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10070 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
10080 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61      pFrom->u.vta
10090 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
100a0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72    }else if( (pFr
100b0 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
100c0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
100d0 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 ){.    pFrom-
100e0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
100f0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
10100 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10110 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
10120 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
10130 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10140 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
10150 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
10160 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
10170 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
10180 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
10190 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
101a0 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
101b0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
101c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
101d0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
101e0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
101f0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
10200 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
10210 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  o) ){.    int i;
10220 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10230 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
10240 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
10250 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
10260 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
10270 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
10280 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65  ->pWLoop && (pLe
10290 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
102a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
102b0 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ABLE) ){.       
102c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
102d0 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
102e0 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  aInLoop);.      
102f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10300 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c  te3WhereClauseCl
10310 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  ear(&pWInfo->sWC
10320 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57  );.    while( pW
10330 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a  Info->pLoops ){.
10340 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
10350 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  *p = pWInfo->pLo
10360 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  ops;.      pWInf
10370 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70  o->pLoops = p->p
10380 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  NextLoop;.      
10390 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28  whereLoopDelete(
103a0 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  db, p);.    }.  
103b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
103c0 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
103d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
103e0 20 54 52 55 45 20 69 66 20 61 6c 6c 20 6f 66 20   TRUE if all of 
103f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
10400 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
10410 28 31 29 20 20 58 20 68 61 73 20 74 68 65 20 73  (1)  X has the s
10420 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
10430 74 20 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32  t that Y.**   (2
10440 29 20 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  )  X is a proper
10450 20 73 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 20   subset of Y.** 
10460 20 20 28 33 29 20 20 58 20 73 6b 69 70 73 20 61    (3)  X skips a
10470 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20  t least as many 
10480 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a  columns as Y.**.
10490 2a 2a 20 42 79 20 22 70 72 6f 70 65 72 20 73 75  ** By "proper su
104a0 62 73 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68  bset" we mean th
104b0 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72 20  at X uses fewer 
104c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
104d0 6d 73 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64  ms.** than Y and
104e0 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52   that every WHER
104f0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73  E clause term us
10500 65 64 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20  ed by X is also 
10510 75 73 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a  used.** by Y..**
10520 0a 2a 2a 20 49 66 20 58 20 69 73 20 61 20 70 72  .** If X is a pr
10530 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
10540 20 74 68 65 6e 20 59 20 69 73 20 61 20 62 65 74   then Y is a bet
10550 74 65 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f  ter choice and o
10560 75 67 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20  ught.** to have 
10570 61 20 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54  a lower cost.  T
10580 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10590 72 6e 73 20 54 52 55 45 20 77 68 65 6e 20 74 68  rns TRUE when th
105a0 61 74 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61  at cost .** rela
105b0 74 69 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65  tionship is inve
105c0 72 74 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  rted and needs t
105d0 6f 20 62 65 20 61 64 6a 75 73 74 65 64 2e 20 20  o be adjusted.  
105e0 54 68 65 20 74 68 69 72 64 20 72 75 6c 65 0a 2a  The third rule.*
105f0 2a 20 77 61 73 20 61 64 64 65 64 20 62 65 63 61  * was added beca
10600 75 73 65 20 69 66 20 58 20 75 73 65 73 20 73 6b  use if X uses sk
10610 69 70 2d 73 63 61 6e 20 6c 65 73 73 20 74 68 61  ip-scan less tha
10620 6e 20 59 20 69 74 20 73 74 69 6c 6c 20 6d 69 67  n Y it still mig
10630 68 74 0a 2a 2a 20 64 65 73 65 72 76 65 20 61 20  ht.** deserve a 
10640 6c 6f 77 65 72 20 63 6f 73 74 20 65 76 65 6e 20  lower cost even 
10650 69 66 20 69 74 20 69 73 20 61 20 70 72 6f 70 65  if it is a prope
10660 72 20 73 75 62 73 65 74 20 6f 66 20 59 2e 0a 2a  r subset of Y..*
10670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
10680 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
10690 70 65 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e  perSubset(.  con
106a0 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58  st WhereLoop *pX
106b0 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ,       /* First
106c0 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f   WhereLoop to co
106d0 6d 70 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  mpare */.  const
106e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20   WhereLoop *pY  
106f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
10700 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 57 68   against this Wh
10710 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ereLoop */.){.  
10720 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20  int i, j;.  if( 
10730 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e  pX->nLTerm-pX->n
10740 53 6b 69 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65  Skip >= pY->nLTe
10750 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a  rm-pY->nSkip ){.
10760 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
10770 20 58 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73   X is not a subs
10780 65 74 20 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20  et of Y */.  }. 
10790 20 69 66 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e   if( pY->nSkip >
107a0 20 70 58 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74   pX->nSkip ) ret
107b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 58 2d  urn 0;.  if( pX-
107c0 3e 72 52 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75  >rRun >= pY->rRu
107d0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  n ){.    if( pX-
107e0 3e 72 52 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e  >rRun > pY->rRun
107f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10800 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
10810 74 68 61 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66  than Y */.    if
10820 28 20 70 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d  ( pX->nOut > pY-
10830 3e 6e 4f 75 74 20 29 20 72 65 74 75 72 6e 20 30  >nOut ) return 0
10840 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20  ;    /* X costs 
10850 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20  more than Y */. 
10860 20 7d 0a 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e   }.  for(i=pX->n
10870 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  LTerm-1; i>=0; i
10880 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  --){.    if( pX-
10890 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20  >aLTerm[i]==0 ) 
108a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
108b0 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31  r(j=pY->nLTerm-1
108c0 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
108d0 20 20 20 20 69 66 28 20 70 59 2d 3e 61 4c 54 65      if( pY->aLTe
108e0 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72  rm[j]==pX->aLTer
108f0 6d 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  m[i] ) break;.  
10900 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
10910 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
10920 58 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  X not a subset o
10930 66 20 59 20 73 69 6e 63 65 20 74 65 72 6d 20 58  f Y since term X
10940 5b 69 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  [i] not used by 
10950 59 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  Y */.  }.  retur
10960 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e  n 1;  /* All con
10970 64 69 74 69 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a  ditions meet */.
10980 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
10990 61 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20  adjust the cost 
109a0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 70 54 65  of WhereLoop pTe
109b0 6d 70 6c 61 74 65 20 75 70 77 61 72 64 73 20 6f  mplate upwards o
109c0 72 20 64 6f 77 6e 77 61 72 64 73 20 73 6f 0a 2a  r downwards so.*
109d0 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  * that:.**.**   
109e0 28 31 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (1) pTemplate co
109f0 73 74 73 20 6c 65 73 73 20 74 68 61 6e 20 61 6e  sts less than an
10a00 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
10a10 70 73 20 74 68 61 74 20 61 72 65 20 61 20 70 72  ps that are a pr
10a20 6f 70 65 72 0a 2a 2a 20 20 20 20 20 20 20 73 75  oper.**       su
10a30 62 73 65 74 20 6f 66 20 70 54 65 6d 70 6c 61 74  bset of pTemplat
10a40 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 70 54  e.**.**   (2) pT
10a50 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6d 6f  emplate costs mo
10a60 72 65 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65  re than any othe
10a70 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 6f 72  r WhereLoops for
10a80 20 77 68 69 63 68 20 70 54 65 6d 70 6c 61 74 65   which pTemplate
10a90 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61 20 70  .**       is a p
10aa0 72 6f 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2a  roper subset..**
10ab0 0a 2a 2a 20 54 6f 20 73 61 79 20 22 57 68 65 72  .** To say "Wher
10ac0 65 4c 6f 6f 70 20 58 20 69 73 20 61 20 70 72 6f  eLoop X is a pro
10ad0 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 22  per subset of Y"
10ae0 20 6d 65 61 6e 73 20 74 68 61 74 20 58 20 75 73   means that X us
10af0 65 73 20 66 65 77 65 72 0a 2a 2a 20 57 48 45 52  es fewer.** WHER
10b00 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
10b10 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
10b20 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
10b30 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
10b40 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 75 73 65 64   is.** also used
10b50 20 62 79 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63   by Y..*/.static
10b60 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 41   void whereLoopA
10b70 64 6a 75 73 74 43 6f 73 74 28 63 6f 6e 73 74 20  djustCost(const 
10b80 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68  WhereLoop *p, Wh
10b90 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
10ba0 74 65 29 7b 0a 20 20 69 66 28 20 28 70 54 65 6d  te){.  if( (pTem
10bb0 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26  plate->wsFlags &
10bc0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
10bd0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
10be0 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  or(; p; p=p->pNe
10bf0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28  xtLoop){.    if(
10c00 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
10c10 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74  ate->iTab ) cont
10c20 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
10c30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10c40 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20  E_INDEXED)==0 ) 
10c50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
10c60 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70  ( whereLoopCheap
10c70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 70  erProperSubset(p
10c80 2c 20 70 54 65 6d 70 6c 61 74 65 29 20 29 7b 0a  , pTemplate) ){.
10c90 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
10ca0 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20 64  pTemplate cost d
10cb0 6f 77 6e 77 61 72 64 20 73 6f 20 74 68 61 74 20  ownward so that 
10cc0 69 74 20 69 73 20 63 68 65 61 70 65 72 20 74 68  it is cheaper th
10cd0 61 6e 20 69 74 73 20 0a 20 20 20 20 20 20 2a 2a  an its .      **
10ce0 20 73 75 62 73 65 74 20 70 2e 20 2a 2f 0a 20 20   subset p. */.  
10cf0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
10d00 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
10d10 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
10d20 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d40 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
10d50 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
10d60 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
10d70 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20  , p->nOut-1));. 
10d80 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
10d90 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
10da0 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10db0 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
10dc0 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  - 1;.    }else i
10dd0 66 28 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  f( whereLoopChea
10de0 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
10df0 70 54 65 6d 70 6c 61 74 65 2c 20 70 29 20 29 7b  pTemplate, p) ){
10e00 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
10e10 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 20   pTemplate cost 
10e20 75 70 77 61 72 64 20 73 6f 20 74 68 61 74 20 69  upward so that i
10e30 74 20 69 73 20 63 6f 73 74 6c 69 65 72 20 74 68  t is costlier th
10e40 61 6e 20 70 20 73 69 6e 63 65 0a 20 20 20 20 20  an p since.     
10e50 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65 20 69 73   ** pTemplate is
10e60 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10e70 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20 20 20 57   of p */.      W
10e80 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28  HERETRACE(0x80,(
10e90 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a  "subset cost adj
10ea0 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f  ustment %d,%d to
10eb0 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d,%d\n",.     
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
10ee0 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  n, pTemplate->nO
10ef0 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  ut, p->rRun, p->
10f00 6e 4f 75 74 2b 31 29 29 3b 0a 20 20 20 20 20 20  nOut+1));.      
10f10 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
10f20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20  = p->rRun;.     
10f30 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10f40 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a   = p->nOut + 1;.
10f50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10f60 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 6c 69  ** Search the li
10f70 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  st of WhereLoops
10f80 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f 6f 6b   in *ppPrev look
10f90 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68 61 74  ing for one that
10fa0 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70 70 6c   can be.** suppl
10fb0 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61  anted by pTempla
10fc0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
10fd0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57 68 65   NULL if the Whe
10fe0 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f 6e 74  reLoop list cont
10ff0 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20 74 68  ains an entry th
11000 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 0a  at can supplant.
11010 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20 69 6e  ** pTemplate, in
11020 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
11030 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e  pTemplate does n
11040 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65  ot belong on the
11050 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
11060 70 58 20 69 73 20 61 20 57 68 65 72 65 4c 6f 6f  pX is a WhereLoo
11070 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61 74 65  p that pTemplate
11080 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c 20 74   can supplant, t
11090 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  hen return the.*
110a0 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e  * link that poin
110b0 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a 2a 20  ts to pX..**.** 
110c0 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  If pTemplate can
110d0 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61 6e 79  not supplant any
110e0 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
110f0 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 62 75  t of the list bu
11100 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
11110 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
11120 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  st, then return 
11130 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11140 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c 69 73   tail of the lis
11150 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  t..*/.static Whe
11160 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65 4c 6f  reLoop **whereLo
11170 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a 20 20  opFindLesser(.  
11180 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72  WhereLoop **ppPr
11190 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  ev,.  const Wher
111a0 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
111b0 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  .){.  WhereLoop 
111c0 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a 70 70  *p;.  for(p=(*pp
111d0 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72 65 76  Prev); p; ppPrev
111e0 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  =&p->pNextLoop, 
111f0 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20 20 20  p=*ppPrev){.    
11200 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54 65  if( p->iTab!=pTe
11210 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c 7c 20  mplate->iTab || 
11220 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70 54 65  p->iSortIdx!=pTe
11230 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49 64 78  mplate->iSortIdx
11240 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
11250 65 69 74 68 65 72 20 74 68 65 20 69 54 61 62 20  either the iTab 
11260 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61 6c 75  or iSortIdx valu
11270 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65 72 65  es for two Where
11280 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65 72 65  Loop are differe
11290 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  nt.      ** then
112a0 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f 6f 70   those WhereLoop
112b0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  s need to be con
112c0 73 69 64 65 72 65 64 20 73 65 70 61 72 61 74 65  sidered separate
112d0 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69 73 0a  ly.  Neither is.
112e0 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e 64 69        ** a candi
112f0 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63 65 20  date to replace 
11300 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a 20 20  the other. */.  
11310 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11320 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68    }.    /* In th
11330 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
11340 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20 72 53  entation, the rS
11350 65 74 75 70 20 76 61 6c 75 65 20 69 73 20 65 69  etup value is ei
11360 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20 2a 2a  ther zero.    **
11370 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20   or the cost of 
11380 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
11390 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e 6c 6f  matic index (Nlo
113a0 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c 6f 67  gN) and the Nlog
113b0 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  N.    ** is the 
113c0 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  same for compati
113d0 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73 2e 20  ble WhereLoops. 
113e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
113f0 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c 20 70  ->rSetup==0 || p
11400 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
11410 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
11420 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53 65 74        || p->rSet
11430 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  up==pTemplate->r
11440 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  Setup );..    /*
11450 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
11460 65 65 28 29 20 61 6c 77 61 79 73 20 67 65 6e 65  ee() always gene
11470 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65 72 74  rates and insert
11480 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
11490 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63 61 73  index.    ** cas
114a0 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63 65 20  e first.  Hence 
114b0 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e 64 69  compatible candi
114c0 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 73 20  date WhereLoops 
114d0 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c 61 72  never have a lar
114e0 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65 74 75  ger.    ** rSetu
114f0 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53 45 54  p. Call this SET
11500 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a 2f 0a  UP-INVARIANT */.
11510 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
11520 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
11530 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
11540 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75 73 69   /* Any loop usi
11550 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69 6f 6e  ng an appliation
11560 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78 20 28  -defined index (
11570 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  or PRIMARY KEY o
11580 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55 45 20  r.    ** UNIQUE 
11590 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69 74 68  constraint) with
115a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d 3d 20   one or more == 
115b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73 20 62  constraints is b
115c0 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  etter.    ** tha
115d0 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  n an automatic i
115e0 6e 64 65 78 2e 20 55 6e 6c 65 73 73 20 69 74 20  ndex. Unless it 
115f0 69 73 20 61 20 73 6b 69 70 2d 73 63 61 6e 2e 20  is a skip-scan. 
11600 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77  */.    if( (p->w
11610 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
11620 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 0a 20 20  UTO_INDEX)!=0.  
11630 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65     && (pTemplate
11640 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a 20 20 20 20  ->nSkip)==0.    
11650 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
11660 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
11670 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
11680 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
11690 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
116a0 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d 30 0a 20 20  COLUMN_EQ)!=0.  
116b0 20 20 20 26 26 20 28 70 2d 3e 70 72 65 72 65 71     && (p->prereq
116c0 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
116d0 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
116e0 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 29 7b 0a  ->prereq.    ){.
116f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11700 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 78   }..    /* If ex
11710 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
11720 20 70 20 69 73 20 62 65 74 74 65 72 20 74 68 61   p is better tha
11730 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 70 54 65  n pTemplate, pTe
11740 6d 70 6c 61 74 65 20 63 61 6e 20 62 65 0a 20 20  mplate can be.  
11750 20 20 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20    ** discarded. 
11760 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20   WhereLoop p is 
11770 62 65 74 74 65 72 20 69 66 3a 0a 20 20 20 20 2a  better if:.    *
11780 2a 20 20 20 28 31 29 20 20 70 20 68 61 73 20 6e  *   (1)  p has n
11790 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
117a0 69 65 73 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ies than pTempla
117b0 74 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  te, and.    **  
117c0 20 28 32 29 20 20 70 20 68 61 73 20 61 6e 20 65   (2)  p has an e
117d0 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f  qual or lower co
117e0 73 74 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  st than pTemplat
117f0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
11800 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
11810 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
11820 3d 3d 70 2d 3e 70 72 65 72 65 71 20 20 20 20 2f  ==p->prereq    /
11830 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26  * (1)  */.     &
11840 26 20 70 2d 3e 72 53 65 74 75 70 3c 3d 70 54 65  & p->rSetup<=pTe
11850 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 20  mplate->rSetup  
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
11880 26 26 20 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d  && p->rRun<=pTem
11890 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20  plate->rRun     
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20 20   /* (2b) */.    
118c0 20 26 26 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65   && p->nOut<=pTe
118d0 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20  mplate->nOut    
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 2f 2a 20 28 32 63 29 20 2a 2f 0a 20 20 20    /* (2c) */.   
11900 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11910 20 30 3b 20 20 2f 2a 20 44 69 73 63 61 72 64 20   0;  /* Discard 
11920 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20  pTemplate */.   
11930 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54   }..    /* If pT
11940 65 6d 70 6c 61 74 65 20 69 73 20 61 6c 77 61 79  emplate is alway
11950 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 2c  s better than p,
11960 20 74 68 65 6e 20 63 61 75 73 65 20 70 20 74 6f   then cause p to
11970 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
11980 20 20 20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d      ** with pTem
11990 70 6c 61 74 65 2e 20 20 70 54 65 6d 70 6c 61 74  plate.  pTemplat
119a0 65 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  e is better than
119b0 20 70 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20   p if:.    **   
119c0 28 31 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (1)  pTemplate h
119d0 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
119e0 64 65 6e 63 65 73 20 74 68 61 6e 20 70 2c 20 61  dences than p, a
119f0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  nd.    **   (2) 
11a00 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 61   pTemplate has a
11a10 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65 72  n equal or lower
11a20 20 63 6f 73 74 20 74 68 61 6e 20 70 2e 0a 20 20   cost than p..  
11a30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
11a40 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
11a50 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54  ate->prereq)==pT
11a60 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 20  emplate->prereq 
11a70 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20 20    /* (1)  */.   
11a80 20 20 26 26 20 70 2d 3e 72 52 75 6e 3e 3d 70 54    && p->rRun>=pT
11a90 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 20 20  emplate->rRun   
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61            /* (2a
11ac0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
11ad0 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut>=pTemplate-
11ae0 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a 20 20 20    /* (2b) */.   
11b10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11b20 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
11b30 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11b40 3b 20 2f 2a 20 53 45 54 55 50 2d 49 4e 56 41 52  ; /* SETUP-INVAR
11b50 49 41 4e 54 20 61 62 6f 76 65 20 2a 2f 0a 20 20  IANT above */.  
11b60 20 20 20 20 62 72 65 61 6b 3b 20 20 20 2f 2a 20      break;   /* 
11b70 43 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76  Cause p to be ov
11b80 65 72 77 72 69 74 74 65 6e 20 62 79 20 70 54 65  erwritten by pTe
11b90 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a  mplate */.    }.
11ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 70 50    }.  return ppP
11bb0 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rev;.}../*.** In
11bc0 73 65 72 74 20 6f 72 20 72 65 70 6c 61 63 65 20  sert or replace 
11bd0 61 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  a WhereLoop entr
11be0 79 20 75 73 69 6e 67 20 74 68 65 20 74 65 6d 70  y using the temp
11bf0 6c 61 74 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a  late supplied..*
11c00 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
11c10 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79   WhereLoop entry
11c20 20 6d 69 67 68 74 20 62 65 20 6f 76 65 72 77 72   might be overwr
11c30 69 74 74 65 6e 20 69 66 20 74 68 65 20 6e 65 77  itten if the new
11c40 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20   template.** is 
11c50 62 65 74 74 65 72 20 61 6e 64 20 68 61 73 20 66  better and has f
11c60 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
11c70 73 2e 20 20 4f 72 20 74 68 65 20 74 65 6d 70 6c  s.  Or the templ
11c80 61 74 65 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ate will be igno
11c90 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e  red.** and no in
11ca0 73 65 72 74 20 77 69 6c 6c 20 6f 63 63 75 72 20  sert will occur 
11cb0 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  if an existing W
11cc0 68 65 72 65 4c 6f 6f 70 20 69 73 20 66 61 73 74  hereLoop is fast
11cd0 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65  er and has.** fe
11ce0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
11cf0 20 74 68 61 6e 20 74 68 65 20 74 65 6d 70 6c 61   than the templa
11d00 74 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  te.  Otherwise a
11d10 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 69   new WhereLoop i
11d20 73 0a 2a 2a 20 61 64 64 65 64 20 62 61 73 65 64  s.** added based
11d30 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65   on the template
11d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c  ..**.** If pBuil
11d50 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e  der->pOrSet is n
11d60 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20  ot NULL then we 
11d70 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c 79 20  care about only 
11d80 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75 69 73  the.** prerequis
11d90 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20 61 6e  ites and rRun an
11da0 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f 66 20  d nOut costs of 
11db0 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f 70 73  the N best loops
11dc0 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66 6f 72  .  That.** infor
11dd0 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68 65 72  mation is gather
11de0 65 64 20 69 6e 20 74 68 65 20 70 42 75 69 6c 64  ed in the pBuild
11df0 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a 65 63  er->pOrSet objec
11e00 74 2e 20 20 54 68 69 73 20 73 70 65 63 69 61 6c  t.  This special
11e10 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6d  .** processing m
11e20 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ode is used only
11e30 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
11e40 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
11e50 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   When accumulati
11e60 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f 6f 70  ng multiple loop
11e70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64 65 72  s (when pBuilder
11e80 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55 4c 4c  ->pOrSet is NULL
11e90 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69  ) we.** still mi
11ea0 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 73 69  ght overwrite si
11eb0 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69 74 68  milar loops with
11ec0 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
11ed0 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
11ee0 74 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74  template is bett
11ef0 65 72 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62  er.  Loops may b
11f00 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
11f10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   the following .
11f20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72  ** conditions ar
11f30 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e met:.**.**    
11f40 28 31 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (1)  They have t
11f50 68 65 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a  he same iTab..**
11f60 20 20 20 20 28 32 29 20 20 54 68 65 79 20 68 61      (2)  They ha
11f70 76 65 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72  ve the same iSor
11f80 74 49 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20  tIdx..**    (3) 
11f90 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61   The template ha
11fa0 73 20 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20  s same or fewer 
11fb0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
11fc0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  n the current lo
11fd0 6f 70 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  op.**    (4)  Th
11fe0 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74  e template has t
11ff0 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
12000 20 63 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63   cost than the c
12010 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73  urrent loop.*/.s
12020 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
12030 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
12040 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
12050 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
12060 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
12070 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
12080 76 2c 20 2a 70 3b 0a 20 20 57 68 65 72 65 49 6e  v, *p;.  WhereIn
12090 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
120a0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
120b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
120c0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
120d0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
120e0 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
120f0 70 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65  pOrSet is define
12100 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65  d, then only kee
12110 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63  p track of the c
12120 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72  osts.  ** and pr
12130 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ereqs..  */.  if
12140 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  ( pBuilder->pOrS
12150 65 74 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  et!=0 ){.    if(
12160 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65   pTemplate->nLTe
12170 72 6d 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54  rm ){.#if WHERET
12180 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
12190 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c     u16 n = pBuil
121a0 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a  der->pOrSet->n;.
121b0 20 20 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65        int x =.#e
121c0 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65  ndif.      where
121d0 4f 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  OrInsert(pBuilde
121e0 72 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70  r->pOrSet, pTemp
121f0 6c 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54  late->prereq, pT
12200 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20  emplate->rRun,. 
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
12240 75 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52  ut);.#if WHERETR
12250 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
12260 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  x8 */.      if( 
12270 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
12280 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20  e & 0x8 ){.     
12290 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
122a0 72 69 6e 74 66 28 78 3f 22 20 20 20 6f 72 2d 25  rintf(x?"   or-%
122b0 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d 58 3a 20  d:  ":"   or-X: 
122c0 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   ", n);.        
122d0 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
122e0 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64  Template, pBuild
122f0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
12300 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
12310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12320 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  _OK;.  }..  /* L
12330 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ook for an exist
12340 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  ing WhereLoop to
12350 20 72 65 70 6c 61 63 65 20 77 69 74 68 20 70 54   replace with pT
12360 65 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77  emplate.  */.  w
12370 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
12380 73 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  st(pWInfo->pLoop
12390 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  s, pTemplate);. 
123a0 20 70 70 50 72 65 76 20 3d 20 77 68 65 72 65 4c   ppPrev = whereL
123b0 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 26 70  oopFindLesser(&p
123c0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
123d0 54 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66  Template);..  if
123e0 28 20 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20  ( ppPrev==0 ){. 
123f0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 6c 72 65     /* There alre
12400 61 64 79 20 65 78 69 73 74 73 20 61 20 57 68 65  ady exists a Whe
12410 72 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69  reLoop on the li
12420 73 74 20 74 68 61 74 20 69 73 20 62 65 74 74 65  st that is bette
12430 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 54  r.    ** than pT
12440 65 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74  emplate, so just
12450 20 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74   ignore pTemplat
12460 65 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52  e */.#if WHERETR
12470 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
12480 78 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  x8 */.    if( sq
12490 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
124a0 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73  & 0x8 ){.      s
124b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
124c0 66 28 22 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a  f("   skip: ");.
124d0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
124e0 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
124f0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
12500 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12520 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  K;  .  }else{.  
12530 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20    p = *ppPrev;. 
12540 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
12550 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
12560 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  it means that ei
12570 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20  ther p[] should 
12580 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
12590 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
125a0 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73  te[] if p[] exis
125b0 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c  ts, or if p==NUL
125c0 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  L then allocate 
125d0 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65  a new.  ** Where
125e0 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20  Loop and insert 
125f0 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45  it..  */.#if WHE
12600 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
12610 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20  /* 0x8 */.  if( 
12620 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
12630 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69  e & 0x8 ){.    i
12640 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( p!=0 ){.     
12650 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
12660 6e 74 66 28 22 72 65 70 6c 61 63 65 3a 20 22 29  ntf("replace: ")
12670 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  ;.      whereLoo
12680 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64  pPrint(p, pBuild
12690 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a  er->pWC);.    }.
126a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
126b0 50 72 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a  Printf("    add:
126c0 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f   ");.    whereLo
126d0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
126e0 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
126f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12700 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
12710 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
12720 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61  w WhereLoop to a
12730 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  dd to the end of
12740 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20   the list */.   
12750 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73   *ppPrev = p = s
12760 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
12770 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  wNN(db, sizeof(W
12780 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
12790 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
127a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
127b0 4b 50 54 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  KPT;.    whereLo
127c0 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70  opInit(p);.    p
127d0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b  ->pNextLoop = 0;
127e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
127f0 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   We will be over
12800 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  writing WhereLoo
12810 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f  p p[].  But befo
12820 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a  re we do, first.
12830 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67      ** go throug
12840 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
12850 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74  e list and delet
12860 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72  e any other entr
12870 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20  ies besides.    
12880 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20  ** p[] that are 
12890 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62  also supplated b
128a0 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
128b0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70     WhereLoop **p
128c0 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78  pTail = &p->pNex
128d0 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65  tLoop;.    Where
128e0 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20  Loop *pToDel;.  
128f0 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c    while( *ppTail
12900 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c   ){.      ppTail
12910 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
12920 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70  Lesser(ppTail, p
12930 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20  Template);.     
12940 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29   if( ppTail==0 )
12950 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
12960 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a  oDel = *ppTail;.
12970 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c        if( pToDel
12980 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
12990 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f     *ppTail = pTo
129a0 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  Del->pNextLoop;.
129b0 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
129c0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
129d0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
129e0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
129f0 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
12a00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12a10 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20  (" delete: ");. 
12a20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
12a30 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42  Print(pToDel, pB
12a40 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
12a50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12a60 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
12a70 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a  te(db, pToDel);.
12a80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
12a90 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
12aa0 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
12ab0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
12ac0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
12ad0 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
12ae0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
12af0 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
12b00 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
12b10 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
12b20 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
12b30 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
12b40 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
12b50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12b60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
12b70 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
12b80 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
12b90 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
12ba0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12bb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
12bc0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
12bd0 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
12be0 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
12bf0 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a  an.** index..*.*
12c00 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52  * For every WHER
12c10 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12c20 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12c30 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12c40 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20 74  nd which has a t
12c50 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12c60 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65   assigned by one
12c70 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   of the likeliho
12c80 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28  od(),.** likely(
12c90 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29  ), or unlikely()
12ca0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20   SQL functions, 
12cb0 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
12cc0 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  ated number.** o
12cd0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79  f output rows by
12ce0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
12cf0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
12d00 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65  * TUNING:  For e
12d10 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12d20 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12d30 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12d40 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12d50 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  h does not have 
12d60 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75 74  an assigned trut
12d70 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68  h probability, h
12d80 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73  euristics.** des
12d90 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65  cribed below are
12da0 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20   used to try to 
12db0 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  estimate the tru
12dc0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a  th probability..
12dd0 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68  ** TODO --> Perh
12de0 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65  aps this is some
12df0 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64  thing that could
12e00 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20   be improved by 
12e10 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20  better.** table 
12e20 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a  statistics..**.*
12e30 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20 20  * Heuristic 1:  
12e40 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  Estimate the tru
12e50 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61  th probability a
12e60 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39  s 93.75%.  The 9
12e70 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63  3.75%.** value c
12e80 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31  orresponds to -1
12e90 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74   in LogEst notat
12ea0 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61  ion, so this mea
12eb0 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20  ns decrement.** 
12ec0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
12ed0 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65  ut field for eve
12ee0 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63 6c  ry such WHERE cl
12ef0 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a  ause term..**.**
12f00 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20 49   Heuristic 2:  I
12f10 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
12f20 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
12f30 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
12f40 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d   the.** form "x=
12f50 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52 20  =EXPR" and EXPR 
12f60 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e  is not a constan
12f70 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  t 0 or 1, then m
12f80 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20  ake sure the.** 
12f90 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77  final output row
12fa0 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20   estimate is no 
12fb0 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34  greater than 1/4
12fc0 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   of the total nu
12fd0 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
12fe0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
12ff0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
13000 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58  ssume that x==EX
13010 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a  PR will filter.*
13020 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33  * out at least 3
13030 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20   out of 4 rows. 
13040 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f   If EXPR is -1 o
13050 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  r 0 or 1, then m
13060 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20  aybe the.** "x" 
13070 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61  column is boolea
13080 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20  n or else -1 or 
13090 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d  0 or 1 is a comm
130a0 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  on default value
130b0 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63  .** on the "x" c
130c0 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20  olumn and so in 
130d0 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63  that case only c
130e0 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  ap the output ro
130f0 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74  w estimate.** at
13100 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20   1/2 instead of 
13110 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  1/4..*/.static v
13120 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
13130 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65  putAdjust(.  Whe
13140 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
13150 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
13160 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
13170 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
13180 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
13190 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61  to adjust downwa
131a0 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rd */.  LogEst n
131b0 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 2f  Row            /
131c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
131d0 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74   in the entire t
131e0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
131f0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
13200 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
13210 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
13220 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
13230 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
13240 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f  nt i, j, k;.  Lo
13250 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20 30  gEst iReduce = 0
13260 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e  ;    /* pLoop->n
13270 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65  Out should not e
13280 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75  xceed nRow-iRedu
13290 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
132a0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
132b0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
132c0 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  DEX)==0 );.  for
132d0 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70  (i=pWC->nTerm, p
132e0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30  Term=pWC->a; i>0
132f0 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i--, pTerm++){
13300 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
13310 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
13320 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72  VIRTUAL)!=0 ) br
13330 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54  eak;.    if( (pT
13340 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
13350 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
13360 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
13370 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
13380 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
13390 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f  Allowed)!=0 ) co
133a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
133b0 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d  j=pLoop->nLTerm-
133c0 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
133d0 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d       pX = pLoop-
133e0 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
133f0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f    if( pX==0 ) co
13400 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
13410 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72  ( pX==pTerm ) br
13420 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
13430 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26  X->iParent>=0 &&
13440 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50   (&pWC->a[pX->iP
13450 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29  arent])==pTerm )
13460 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13470 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
13480 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
13490 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
134a0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72        /* If a tr
134b0 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
134c0 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73 69  is specified usi
134d0 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  ng the likelihoo
134e0 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20  d() hints,.     
134f0 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74     ** then use t
13500 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70  he probability p
13510 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 61  rovided by the a
13520 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  pplication. */. 
13530 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
13540 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
13550 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
13560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
13570 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
13580 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74 68  f explicit truth
13590 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20   probabilities, 
135a0 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20 74  use heuristics t
135b0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65  o.        ** gue
135c0 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20  ss a reasonable 
135d0 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
135e0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  y. */.        pL
135f0 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20  oop->nOut--;.   
13600 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
13610 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51  eOperator&(WO_EQ
13620 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
13630 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
13640 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
13650 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
13660 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
13670 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  erm->pExpr->op==
13680 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  TK_IS );.       
13690 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
136a0 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69 67  prIsInteger(pRig
136b0 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d  ht, &k) && k>=(-
136c0 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20  1) && k<=1 ){.  
136d0 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30            k = 10
136e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
136f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  e{.            k
13700 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20   = 20;.         
13710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
13720 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65   iReduce<k ) iRe
13730 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20  duce = k;.      
13740 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13750 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
13760 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69  p->nOut > nRow-i
13770 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d  Reduce )  pLoop-
13780 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69  >nOut = nRow - i
13790 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  Reduce;.}../* .*
137a0 2a 20 54 65 72 6d 20 70 54 65 72 6d 20 69 73 20  * Term pTerm is 
137b0 61 20 76 65 63 74 6f 72 20 72 61 6e 67 65 20 63  a vector range c
137c0 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
137d0 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20 63  ion. The first c
137e0 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20  omparison.** in 
137f0 74 68 65 20 76 65 63 74 6f 72 20 63 61 6e 20 62  the vector can b
13800 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
13810 67 20 63 6f 6c 75 6d 6e 20 6e 45 71 20 6f 66 20  g column nEq of 
13820 74 68 65 20 69 6e 64 65 78 2e 20 54 68 69 73 0a  the index. This.
13830 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
13840 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
13850 6d 62 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65  mber of vector e
13860 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 63 61 6e  lements that can
13870 20 62 65 20 75 73 65 64 0a 2a 2a 20 61 73 20 70   be used.** as p
13880 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
13890 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a   comparison..**.
138a0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
138b0 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
138c0 0a 2a 2a 0a 2a 2a 20 20 20 57 48 45 52 45 20 61  .**.**   WHERE a
138d0 20 3d 20 3f 20 41 4e 44 20 28 62 2c 20 63 2c 20   = ? AND (b, c, 
138e0 64 29 20 3e 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a  d) > (?, ?, ?).*
138f0 2a 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64  *.** and the ind
13900 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ex:.**.**   CREA
13910 54 45 20 49 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20  TE INDEX ... ON 
13920 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  (a, b, c, d, e).
13930 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  **.** then this 
13940 66 75 6e 63 74 69 6f 6e 20 77 6f 75 6c 64 20 62  function would b
13950 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e  e invoked with n
13960 45 71 3d 31 2e 20 54 68 65 20 76 61 6c 75 65 20  Eq=1. The value 
13970 72 65 74 75 72 6e 65 64 20 69 6e 0a 2a 2a 20 74  returned in.** t
13980 68 69 73 20 63 61 73 65 20 69 73 20 33 2e 0a 2a  his case is 3..*
13990 2f 0a 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  /.int whereRange
139a0 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72  VectorLen(.  Par
139b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
139c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
139d0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  text */.  int iC
139e0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur,            /
139f0 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
13a00 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
13a10 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
13a20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
13a30 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 69 6e  be used for a in
13a40 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
13a50 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  int */.  int nEq
13a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13a70 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72   Number of prior
13a80 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
13a90 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e  aints on same in
13aa0 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
13ab0 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a  rm *pTerm     /*
13ac0 20 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65 71   The vector ineq
13ad0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
13ae0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  t */.){.  int nC
13af0 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  mp = sqlite3Expr
13b00 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d  VectorSize(pTerm
13b10 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
13b20 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d  .  int i;..  nCm
13b30 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70  p = MIN(nCmp, (p
13b40 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e  Idx->nColumn - n
13b50 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Eq));.  for(i=1;
13b60 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20   i<nCmp; i++){. 
13b70 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f     /* Test if co
13b80 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54  mparison i of pT
13b90 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  erm is compatibl
13ba0 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69  e with column (i
13bb0 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66  +nEq) .    ** of
13bc0 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e   the index. If n
13bd0 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f  ot, exit the loo
13be0 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  p.  */.    char 
13bf0 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
13c00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
13c10 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20  arison affinity 
13c20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78 61  */.    char idxa
13c30 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
13c40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20       /* Indexed 
13c50 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
13c60 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
13c70 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
13c80 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
13c90 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  son collation se
13ca0 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78  quence */.    Ex
13cb0 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d  pr *pLhs = pTerm
13cc0 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  ->pExpr->pLeft->
13cd0 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
13ce0 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
13cf0 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  Rhs = pTerm->pEx
13d00 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
13d10 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
13d20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
13d30 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70  {.      pRhs = p
13d40 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  Rhs->x.pSelect->
13d50 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
13d60 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
13d70 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73       pRhs = pRhs
13d80 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
13d90 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  pExpr;.    }..  
13da0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
13db0 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63  the LHS of the c
13dc0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
13dd0 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20  olumn reference 
13de0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  to.    ** the ri
13df0 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ght column of th
13e00 65 20 72 69 67 68 74 20 73 6f 75 72 63 65 20 74  e right source t
13e10 61 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20 74  able. And that t
13e20 68 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f  he sort.    ** o
13e30 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  rder of the inde
13e40 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  x column is the 
13e50 73 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72 74  same as the sort
13e60 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20 20   order of the.  
13e70 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e    ** leftmost in
13e80 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a  dex column.  */.
13e90 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70      if( pLhs->op
13ea0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
13eb0 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c    || pLhs->iTabl
13ec0 65 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c  e!=iCur .     ||
13ed0 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   pLhs->iColumn!=
13ee0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
13ef0 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70  +nEq] .     || p
13f00 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
13f10 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53  i+nEq]!=pIdx->aS
13f20 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20  ortOrder[nEq].  
13f30 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
13f40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
13f50 74 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f  tcase( pLhs->iCo
13f60 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29  lumn==XN_ROWID )
13f70 3b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  ;.    aff = sqli
13f80 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
13f90 74 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33  ty(pRhs, sqlite3
13fa0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68  ExprAffinity(pLh
13fb0 73 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20  s));.    idxaff 
13fc0 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f  = sqlite3TableCo
13fd0 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49 64  lumnAffinity(pId
13fe0 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d  x->pTable, pLhs-
13ff0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69  >iColumn);.    i
14000 66 28 20 61 66 66 21 3d 69 64 78 61 66 66 20 29  f( aff!=idxaff )
14010 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f   break;..    pCo
14020 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
14030 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
14040 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
14050 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Rhs);.    if( pC
14060 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oll==0 ) break;.
14070 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
14080 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
14090 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
140a0 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65 61  l[i+nEq]) ) brea
140b0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
140c0 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  i;.}../*.** Adju
140d0 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62 79  st the cost C by
140e0 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61   the costMult fa
140f0 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e  cter T.  This on
14100 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20  ly occurs if.** 
14110 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44  compiled with -D
14120 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
14130 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66  STMULT.*/.#ifdef
14140 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
14150 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65  OSTMULT.# define
14160 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
14170 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20  lier(C,T)  C += 
14180 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  T.#else.# define
14190 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
141a0 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66  lier(C,T).#endif
141b0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20  ../*.** We have 
141c0 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70  so far matched p
141d0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
141e0 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73  .btree.nEq terms
141f0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65   of the .** inde
14200 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f  x pIndex. Try to
14210 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e   match one more.
14220 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
14230 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
14240 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  led, pBuilder->p
14250 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69  New->nOut contai
14260 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65  ns the .** numbe
14270 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74  r of rows expect
14280 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
14290 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73   by filtering us
142a0 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20  ing the nEq .** 
142b0 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69  terms only. If i
142c0 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74  t is modified, t
142d0 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 73  his value is res
142e0 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68 69  tored before thi
142f0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
14300 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  eturns..**.** If
14310 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30   pProbe->tnum==0
14320 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e  , that means pIn
14330 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e  dex is a fake in
14340 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65  dex used for the
14350 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
14360 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74  ARY KEY..*/.stat
14370 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
14380 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20  AddBtreeIndex(. 
14390 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
143a0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20  r *pBuilder,    
143b0 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
143c0 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73  p factory */.  s
143d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
143e0 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f  em *pSrc,      /
143f0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
14400 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
14410 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
14420 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20  robe,           
14430 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
14440 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20  ex on pSrc */.  
14450 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20  LogEst nInMul   
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66  /* log(Number of
14480 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20   iterations due 
14490 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57  to IN) */.){.  W
144a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
144b0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
144c0 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61  nfo;  /* WHERE a
144d0 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a  nalyse context *
144e0 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
144f0 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
14500 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se;        /* Pa
14510 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14520 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14530 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
14540 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
14550 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63  onnection malloc
14560 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
14570 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14590 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
145a0 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  oop under constr
145b0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  uction */.  Wher
145c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
145d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
145e0 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72   WhereTerm under
145f0 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
14600 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20  /.  int opMask; 
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14620 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65      /* Valid ope
14630 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74  rators for const
14640 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72  raints */.  Wher
14650 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20  eScan scan;     
14660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14670 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52  terator for WHER
14680 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  E terms */.  Bit
14690 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65  mask saved_prere
146a0 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  q;           /* 
146b0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
146c0 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a  f pNew->prereq *
146d0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c  /.  u16 saved_nL
146e0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
146f0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14700 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
14710 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73  LTerm */.  u16 s
14720 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20  aved_nEq;       
14730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
14740 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
14750 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14760 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
14770 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20 20 20 20  _nBtm;          
14780 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14790 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
147a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a  ->u.btree.nBtm *
147b0 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 54  /.  u16 saved_nT
147c0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
147d0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
147e0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
147f0 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20  .btree.nTop */. 
14800 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70   u16 saved_nSkip
14810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14820 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14830 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69  ue of pNew->nSki
14840 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
14850 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
14860 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14870 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14880 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
14890 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
148a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
148b0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
148c0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
148d0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
148e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
148f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14900 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  de */.  LogEst r
14910 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
14920 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14930 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
14940 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
14950 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
14960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
14970 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
14980 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
14990 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
149a0 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
149b0 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
149c0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
149d0 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
149e0 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
149f0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
14a00 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
14a10 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
14a20 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
14a30 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
14a40 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
14a50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14a60 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
14a70 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
14a80 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  )==0 );.  if( pN
14a90 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
14aa0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
14ab0 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
14ac0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c  _LT|WO_LE;.  }el
14ad0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
14ae0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
14af0 74 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70 4d  tm==0 );.    opM
14b00 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
14b10 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  N|WO_GT|WO_GE|WO
14b20 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e  _LT|WO_LE|WO_ISN
14b30 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20  ULL|WO_IS;.  }. 
14b40 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e   if( pProbe->bUn
14b50 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b  ordered ) opMask
14b60 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47   &= ~(WO_GT|WO_G
14b70 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a  E|WO_LT|WO_LE);.
14b80 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
14b90 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
14ba0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  obe->nColumn );.
14bb0 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
14bc0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14bd0 3b 0a 20 20 73 61 76 65 64 5f 6e 42 74 6d 20 3d  ;.  saved_nBtm =
14be0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14bf0 42 74 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54 6f  Btm;.  saved_nTo
14c00 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  p = pNew->u.btre
14c10 65 2e 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64 5f  e.nTop;.  saved_
14c20 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53  nSkip = pNew->nS
14c30 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54  kip;.  saved_nLT
14c40 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65  erm = pNew->nLTe
14c50 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c  rm;.  saved_wsFl
14c60 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c  ags = pNew->wsFl
14c70 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65  ags;.  saved_pre
14c80 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  req = pNew->prer
14c90 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74  eq;.  saved_nOut
14ca0 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
14cb0 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
14cc0 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42  anInit(&scan, pB
14cd0 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72  uilder->pWC, pSr
14ce0 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61 76 65  c->iCursor, save
14cf0 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20  d_nEq,.         
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
14d10 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  pMask, pProbe);.
14d20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
14d30 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50   0;.  rSize = pP
14d40 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
14d50 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65  t[0];.  rLogSize
14d60 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29   = estLog(rSize)
14d70 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  ;.  for(; rc==SQ
14d80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
14d90 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65  !=0; pTerm = whe
14da0 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e  reScanNext(&scan
14db0 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20  )){.    u16 eOp 
14dc0 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  = pTerm->eOperat
14dd0 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  or;   /* Shortha
14de0 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f  nd for pTerm->eO
14df0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c  perator */.    L
14e00 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a  ogEst rCostIdx;.
14e10 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55      LogEst nOutU
14e20 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20  nadjusted;      
14e30 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65    /* nOut before
14e40 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20   IN() and WHERE 
14e50 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20  adjustments */. 
14e60 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a     int nIn = 0;.
14e70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14e80 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
14e90 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63  AT4.    int nRec
14ea0 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
14eb0 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  ->nRecValid;.#en
14ec0 64 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70  dif.    if( (eOp
14ed0 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28  ==WO_ISNULL || (
14ee0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54  pTerm->wtFlags&T
14ef0 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20  ERM_VNULL)!=0). 
14f00 20 20 20 20 26 26 20 69 6e 64 65 78 43 6f 6c 75      && indexColu
14f10 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62 65  mnNotNull(pProbe
14f20 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a 20 20 20  , saved_nEq).   
14f30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
14f40 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53  ue; /* ignore IS
14f50 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73   [NOT] NULL cons
14f60 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e  traints on NOT N
14f70 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
14f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65     }.    if( pTe
14f90 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
14fa0 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
14fb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
14fc0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
14fd0 77 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  w the upper boun
14fe0 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69  d of a LIKE opti
14ff0 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63  mization range c
15000 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a  onstraint.    **
15010 20 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c   to mix with a l
15020 6f 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64  ower range bound
15030 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72   from some other
15040 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69   source */.    i
15050 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
15060 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
15070 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72   && pTerm->eOper
15080 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f  ator==WO_LT ) co
15090 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
150a0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 49 53 20  Do not allow IS 
150b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d  constraints from
150c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
150d0 65 20 74 6f 20 62 65 20 75 73 65 64 20 62 79 20  e to be used by 
150e0 74 68 65 0a 20 20 20 20 2a 2a 20 72 69 67 68 74  the.    ** right
150f0 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
15100 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e   JOIN.  Only con
15110 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
15120 4f 4e 20 63 6c 61 75 73 65 20 61 72 65 0a 20 20  ON clause are.  
15130 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a    ** allowed */.
15140 20 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66      if( (pSrc->f
15150 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
15160 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26  LEFT)!=0.     &&
15170 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15180 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
15190 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
151a0 20 20 26 26 20 28 65 4f 70 20 26 20 28 57 4f 5f    && (eOp & (WO_
151b0 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d  IS|WO_ISNULL))!=
151c0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  0.    ){.      t
151d0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
151e0 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  O_IS );.      te
151f0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
15200 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
15210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
15220 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
15230 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
15240 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
15250 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
15260 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
15270 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d  ->u.btree.nBtm =
15280 20 73 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 20   saved_nBtm;.   
15290 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
152a0 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70  Top = saved_nTop
152b0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
152c0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
152d0 6d 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  m;.    if( where
152e0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
152f0 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
15300 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
15310 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77   OOM */.    pNew
15320 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
15330 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d  LTerm++] = pTerm
15340 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
15350 65 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72  eq = (saved_prer
15360 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
15370 65 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77  eqRight) & ~pNew
15380 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20  ->maskSelf;..   
15390 20 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d   assert( nInMul=
153a0 3d 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  =0.        || (p
153b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
153c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
153d0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
153e0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
153f0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
15400 4e 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c  N)!=0 .        |
15410 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
15420 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41   & WHERE_SKIPSCA
15430 4e 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20  N)!=0 .    );.. 
15440 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f     if( eOp & WO_
15450 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
15460 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
15470 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  >pExpr;.      pN
15480 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
15490 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a  HERE_COLUMN_IN;.
154a0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
154b0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
154c0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
154d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
154e0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
154f0 3a 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53  :  TUNING: the S
15500 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35  ELECT returns 25
15510 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20   rows */.       
15520 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
15530 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
15540 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
15550 67 45 73 74 28 32 35 29 20 29 3b 0a 0a 20 20 20  gEst(25) );..   
15560 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
15570 65 73 73 69 6f 6e 20 6d 61 79 20 61 63 74 75 61  ession may actua
15580 6c 6c 79 20 62 65 20 6f 66 20 74 68 65 20 66 6f  lly be of the fo
15590 72 6d 20 28 78 2c 20 79 29 20 49 4e 20 28 53 45  rm (x, y) IN (SE
155a0 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20 20 20 20 20  LECT...)..      
155b0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
155c0 65 20 74 68 65 72 65 20 69 73 20 61 20 73 65 70  e there is a sep
155d0 61 72 61 74 65 20 74 65 72 6d 20 66 6f 72 20 65  arate term for e
155e0 61 63 68 20 6f 66 20 28 78 29 20 61 6e 64 20 28  ach of (x) and (
155f0 79 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 48  y)..        ** H
15600 6f 77 65 76 65 72 2c 20 74 68 65 20 6e 49 6e 20  owever, the nIn 
15610 6d 75 6c 74 69 70 6c 69 65 72 20 73 68 6f 75 6c  multiplier shoul
15620 64 20 6f 6e 6c 79 20 62 65 20 61 70 70 6c 69 65  d only be applie
15630 64 20 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e 63 65  d once, not once
15640 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
15650 65 61 63 68 20 73 75 63 68 20 74 65 72 6d 2e 20  each such term. 
15660 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
15670 6f 70 20 63 68 65 63 6b 73 20 74 68 61 74 20 70  op checks that p
15680 54 65 72 6d 20 69 73 20 74 68 65 0a 20 20 20 20  Term is the.    
15690 20 20 20 20 2a 2a 20 66 69 72 73 74 20 73 75 63      ** first suc
156a0 68 20 74 65 72 6d 20 69 6e 20 75 73 65 2c 20 61  h term in use, a
156b0 6e 64 20 73 65 74 73 20 6e 49 6e 20 62 61 63 6b  nd sets nIn back
156c0 20 74 6f 20 30 20 69 66 20 69 74 20 69 73 20 6e   to 0 if it is n
156d0 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ot. */.        f
156e0 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e  or(i=0; i<pNew->
156f0 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a  nLTerm-1; i++){.
15700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
15710 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70  ew->aLTerm[i]->p
15720 45 78 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49  Expr==pExpr ) nI
15730 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
15740 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15750 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
15760 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
15770 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
15780 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22   ){.        /* "
15790 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
157a0 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
157b0 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74       nIn = sqlit
157c0 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e  e3LogEst(pExpr->
157d0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  x.pList->nExpr);
157e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
157f0 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48   nIn>0 );  /* RH
15800 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f  S always has 2 o
15810 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20  r more terms... 
15820 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20 20   The parser.    
15830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15840 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73        ** changes
15850 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f   "x IN (?)" into
15860 20 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20   "x=?". */.     
15870 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
15880 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f   eOp & (WO_EQ|WO
15890 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  _IS) ){.      in
158a0 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d  t iCol = pProbe-
158b0 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
158c0 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  nEq];.      pNew
158d0 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
158e0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
158f0 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65      assert( save
15900 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62  d_nEq==pNew->u.b
15910 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20  tree.nEq );.    
15920 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52    if( iCol==XN_R
15930 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  OWID .       || 
15940 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75  (iCol>0 && nInMu
15950 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45  l==0 && saved_nE
15960 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  q==pProbe->nKeyC
15970 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  ol-1).      ){. 
15980 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
15990 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e  =0 && pProbe->un
159a0 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  iqNotNull==0 ){.
159b0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
159c0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
159d0 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
159e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
159f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
15a00 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
15a10 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
15a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15a30 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
15a40 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
15a50 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
15a60 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
15a70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15a80 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
15a90 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
15aa0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
15ab0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
15ac0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
15ad0 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
15ae0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
15af0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
15b00 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
15b10 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
15b20 72 65 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65  ree.nBtm = where
15b30 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a  RangeVectorLen(.
15b40 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
15b50 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  , pSrc->iCursor,
15b60 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e   pProbe, saved_n
15b70 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20  Eq, pTerm.      
15b80 29 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  );.      pBtm = 
15b90 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f  pTerm;.      pTo
15ba0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
15bb0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
15bc0 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
15bd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e  {.        /* Ran
15be0 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68  ge contraints th
15bf0 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65  at come from the
15c00 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
15c10 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  on are.        *
15c20 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e  * always used in
15c30 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20   pairs. */.     
15c40 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d     pTop = &pTerm
15c50 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
15c60 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72  ert( (pTop-(pTer
15c70 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72  m->pWC->a))<pTer
15c80 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b  m->pWC->nTerm );
15c90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15ca0 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26   pTop->wtFlags &
15cb0 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b   TERM_LIKEOPT );
15cc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15cd0 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72   pTop->eOperator
15ce0 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==WO_LT );.     
15cf0 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
15d00 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
15d10 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
15d20 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
15d30 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
15d40 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
15d50 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b  LTerm++] = pTop;
15d60 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
15d70 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15d80 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
15d90 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
15da0 2e 6e 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20  .nTop = 1;.     
15db0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
15dc0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
15dd0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20  & (WO_LT|WO_LE) 
15de0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15df0 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29  e( eOp & WO_LT )
15e00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15e10 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b  ( eOp & WO_LE );
15e20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
15e30 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
15e40 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
15e50 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
15e60 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
15e70 6e 54 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67  nTop = whereRang
15e80 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20  eVectorLen(.    
15e90 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
15ea0 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72  rc->iCursor, pPr
15eb0 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20  obe, saved_nEq, 
15ec0 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20  pTerm.      );. 
15ed0 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72       pTop = pTer
15ee0 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  m;.      pBtm = 
15ef0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
15f00 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
15f10 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
15f20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
15f30 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
15f40 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20  LTerm-2] : 0;.  
15f50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
15f60 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e  his point pNew->
15f70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
15f80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
15f90 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20  s expected to.  
15fa0 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20    ** be visited 
15fb0 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  by the index sca
15fc0 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65  n before conside
15fd0 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c  ring term pTerm,
15fe0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76   or the.    ** v
15ff0 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64  alues of nIn and
16000 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65   nInMul. In othe
16010 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e  r words, assumin
16020 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20  g that all .    
16030 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74  ** "x IN(...)" t
16040 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65  erms are replace
16050 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20  d with "x = ?". 
16060 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74  This block updat
16070 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  es.    ** the va
16080 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
16090 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  t to account for
160a0 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20   pTerm (but not 
160b0 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f  nIn/nInMul).  */
160c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
160d0 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
160e0 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Out );.    if( p
160f0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
16100 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
16110 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  E ){.      /* Ad
16120 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20  just nOut using 
16130 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61  stat3/stat4 data
16140 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69  . Or, if there i
16150 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34  s no stat3/stat4
16160 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20  .      ** data, 
16170 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72  using some other
16180 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20   estimate.  */. 
16190 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
161a0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
161b0 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70  Builder, pBtm, p
161c0 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  Top, pNew);.    
161d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
161e0 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75   nEq = ++pNew->u
161f0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20  .btree.nEq;.    
16200 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
16210 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
16220 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b  |WO_IN|WO_IS) );
16230 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
16240 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
16250 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  d_nOut );.      
16260 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68  if( pTerm->truth
16270 50 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62  Prob<=0 && pProb
16280 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65  e->aiColumn[save
16290 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20  d_nEq]>=0 ){.   
162a0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65 4f       assert( (eO
162b0 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49  p & WO_IN) || nI
162c0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
162d0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
162e0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20  WO_IN );.       
162f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70   pNew->nOut += p
16300 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
16310 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
16320 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
16330 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
16340 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16350 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
16360 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75       tRowcnt nOu
16370 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
16380 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20  f( nInMul==0 .  
16390 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
163a0 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
163b0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
163c0 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65  tree.nEq<=pProbe
163d0 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20  ->nSampleCol.   
163e0 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20 26        && ((eOp &
163f0 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45   WO_IN)==0 || !E
16400 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16410 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
16420 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20  xIsSelect)).    
16430 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
16440 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
16450 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
16460 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20         if( (eOp 
16470 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
16480 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b  LL|WO_IS))!=0 ){
16490 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
164a0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
164b0 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EQ );.          
164c0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
164d0 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
164e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
164f0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
16500 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16510 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
16520 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
16530 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
16540 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a  pRight, &nOut);.
16550 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
16560 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
16570 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  = whereInScanEst
16580 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
16590 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  r, pExpr->x.pLis
165a0 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20  t, &nOut);.     
165b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
165c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
165d0 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
165e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
165f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16600 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20  ITE_OK ) break; 
16610 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
16620 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65 72   out of the pTer
16630 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  m loop */.      
16640 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a      if( nOut ){.
16650 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
16660 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
16670 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20  LogEst(nOut);.  
16680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
16690 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e  ew->nOut>saved_n
166a0 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out ) pNew->nOut
166b0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
166c0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
166d0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
166e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
166f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16700 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66  nOut==0 ).#endif
16710 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
16720 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
16730 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f  += (pProbe->aiRo
16740 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70  wLogEst[nEq] - p
16750 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
16760 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20  st[nEq-1]);.    
16770 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20        if( eOp & 
16780 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
16790 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49           /* TUNI
167a0 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20  NG: If there is 
167b0 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  no likelihood() 
167c0 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68  value, assume th
167d0 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20 20  at a .          
167e0 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c    ** "col IS NUL
167f0 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  L" expression ma
16800 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20 6d  tches twice as m
16810 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20  any rows .      
16820 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c        ** as (col
16830 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  =?). */.        
16840 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
16850 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
16860 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
16870 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
16880 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20 74  * Set rCostIdx t
16890 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  o the cost of vi
168a0 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20  siting selected 
168b0 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41  rows in index. A
168c0 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20  dd.    ** it to 
168d0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63  pNew->rRun, whic
168e0 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  h is currently s
168f0 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f  et to the cost o
16900 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
16910 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68  ** seek only. Th
16920 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  en, if this is a
16930 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
16940 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73  dex, add the cos
16950 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69  t of.    ** visi
16960 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e  ting the rows in
16970 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
16980 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64    */.    rCostId
16990 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  x = pNew->nOut +
169a0 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
169b0 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d  >szIdxRow)/pSrc-
169c0 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  >pTab->szTabRow;
169d0 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
169e0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
169f0 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f  dd(rLogSize, rCo
16a00 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20  stIdx);.    if( 
16a10 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
16a20 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   (WHERE_IDX_ONLY
16a30 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20  |WHERE_IPK))==0 
16a40 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  ){.      pNew->r
16a50 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
16a60 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
16a70 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20  n, pNew->nOut + 
16a80 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41  16);.    }.    A
16a90 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
16aa0 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
16ab0 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63  Probe->pTable->c
16ac0 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e  ostMult);..    n
16ad0 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20  OutUnadjusted = 
16ae0 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20  pNew->nOut;.    
16af0 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49  pNew->rRun += nI
16b00 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
16b10 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49  pNew->nOut += nI
16b20 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
16b30 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
16b40 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e  djust(pBuilder->
16b50 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
16b60 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  );.    rc = wher
16b70 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
16b80 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  lder, pNew);..  
16b90 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
16ba0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
16bb0 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
16bc0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
16bd0 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d  aved_nOut;.    }
16be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
16bf0 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61  ->nOut = nOutUna
16c00 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a  djusted;.    }..
16c10 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
16c20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
16c30 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20  OP_LIMIT)==0.   
16c40 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
16c50 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  ee.nEq<pProbe->n
16c60 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20  Column.    ){.  
16c70 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
16c80 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
16c90 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
16ca0 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a  e, nInMul+nIn);.
16cb0 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
16cc0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
16cd0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
16ce0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
16cf0 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c  _STAT4.    pBuil
16d00 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
16d10 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64   nRecValid;.#end
16d20 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  if.  }.  pNew->p
16d30 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72  rereq = saved_pr
16d40 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  ereq;.  pNew->u.
16d50 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
16d60 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  d_nEq;.  pNew->u
16d70 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61  .btree.nBtm = sa
16d80 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77  ved_nBtm;.  pNew
16d90 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
16da0 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70   saved_nTop;.  p
16db0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
16dc0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77  ed_nSkip;.  pNew
16dd0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
16de0 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
16df0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
16e00 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
16e10 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
16e20 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69  erm;..  /* Consi
16e30 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70  der using a skip
16e40 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61  -scan if there a
16e50 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
16e60 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
16e70 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   ** available fo
16e80 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  r the left-most 
16e90 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
16ea0 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61  ex, and if the a
16eb0 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  verage.  ** numb
16ec0 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e  er of repeats in
16ed0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
16ee0 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74  erms is at least
16ef0 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   18. .  **.  ** 
16f00 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  The magic number
16f10 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20   18 is selected 
16f20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61  on the basis tha
16f30 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f  t scanning 17 ro
16f40 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73  ws.  ** is almos
16f50 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72  t always quicker
16f60 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73   than an index s
16f70 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68  eek (even though
16f80 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   if the index.  
16f90 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ** contains fewe
16fa0 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73  r than 2^17 rows
16fb0 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72   we assume other
16fc0 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61  wise in other pa
16fd0 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rts of.  ** the 
16fe0 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e  code). And, even
16ff0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   if it is not, i
17000 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
17010 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e  too much slower.
17020 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74   .  ** On the ot
17030 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78  her hand, the ex
17040 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20  tra seeks could 
17050 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67  end up being sig
17060 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
17070 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20  more expensive. 
17080 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32   */.  assert( 42
17090 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
170a0 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76  18) );.  if( sav
170b0 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53  ed_nEq==saved_nS
170c0 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f  kip.   && saved_
170d0 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b  nEq+1<pProbe->nK
170e0 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f  eyCol.   && pPro
170f0 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d  be->noSkipScan==
17100 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  0.   && pProbe->
17110 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
17120 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
17130 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
17140 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
17150 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
17160 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
17170 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
17180 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
17190 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
171a0 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
171b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
171c0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  ++;.    pNew->nS
171d0 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  kip++;.    pNew-
171e0 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
171f0 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  Term++] = 0;.   
17200 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
17210 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  = WHERE_SKIPSCAN
17220 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50  ;.    nIter = pP
17230 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
17240 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70  t[saved_nEq] - p
17250 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
17260 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b  st[saved_nEq+1];
17270 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
17280 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a  -= nIter;.    /*
17290 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73   TUNING:  Becaus
172a0 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20  e uncertainties 
172b0 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  in the estimates
172c0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71   for skip-scan q
172d0 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61  ueries,.    ** a
172e0 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65  dd a 1.375 fudge
172f0 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20   factor to make 
17300 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74  skip-scan slight
17310 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20  ly less likely. 
17320 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20  */.    nIter += 
17330 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  5;.    whereLoop
17340 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
17350 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
17360 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49  robe, nIter + nI
17370 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d  nMul);.    pNew-
17380 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
17390 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ut;.    pNew->u.
173a0 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
173b0 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
173c0 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
173d0 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Skip;.    pNew->
173e0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
173f0 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  wsFlags;.  }..  
17400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17410 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20  .** Return True 
17420 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
17430 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69  e that pIndex mi
17440 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e  ght be useful in
17450 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
17460 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
17470 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72  ause in pBuilder
17480 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ..**.** Return F
17490 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72  alse if pBuilder
174a0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
174b0 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
174c0 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68  ause or.** if th
174d0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f  ere is no way fo
174e0 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75  r pIndex to be u
174f0 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65  seful in impleme
17500 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52  nting that.** OR
17510 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
17520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
17530 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
17540 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c  rderBy(.  WhereL
17550 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
17560 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70  lder,.  Index *p
17570 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75  Index,.  int iCu
17580 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69  rsor.){.  ExprLi
17590 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c  st *pOB;.  ExprL
175a0 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20  ist *aColExpr;. 
175b0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20   int ii, jj;..  
175c0 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f  if( pIndex->bUno
175d0 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20  rdered ) return 
175e0 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20  0;.  if( (pOB = 
175f0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
17600 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29  ->pOrderBy)==0 )
17610 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
17620 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e  (ii=0; ii<pOB->n
17630 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
17640 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73   Expr *pExpr = s
17650 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
17660 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d  llate(pOB->a[ii]
17670 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
17680 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
17690 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
176a0 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20  iTable==iCursor 
176b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
176c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20  pr->iColumn<0 ) 
176d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
176e0 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
176f0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a  dex->nKeyCol; jj
17700 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17710 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
17720 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
17730 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31  n[jj] ) return 1
17740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
17750 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70  lse if( (aColExp
17760 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  r = pIndex->aCol
17770 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  Expr)!=0 ){.    
17780 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
17790 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
177a0 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
177b0 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  f( pIndex->aiCol
177c0 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52  umn[jj]!=XN_EXPR
177d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
177e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
177f0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
17800 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a  r,aColExpr->a[jj
17810 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29  ].pExpr,iCursor)
17820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
17830 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
17840 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17850 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17860 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
17870 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65  rn a bitmask whe
17880 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74  re 1s indicate t
17890 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hat the correspo
178a0 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a  nding column of.
178b0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
178c0 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
178d0 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
178e0 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65  t 63 columns are
178f0 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
17900 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
17910 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e  olumnsInIndex(In
17920 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69  dex *pIdx){.  Bi
17930 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69  tmask m = 0;.  i
17940 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49  nt j;.  for(j=pI
17950 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a  dx->nColumn-1; j
17960 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69  >=0; j--){.    i
17970 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
17980 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66  olumn[j];.    if
17990 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
179a0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
179b0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
179c0 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29  case( x==BMS-2 )
179d0 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d  ;.      if( x<BM
179e0 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42  S-1 ) m |= MASKB
179f0 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IT(x);.    }.  }
17a00 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
17a10 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
17a20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  if a partial ind
17a30 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64  ex with pPartInd
17a40 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75  exWhere can be u
17a50 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  sed.** in the cu
17a60 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65  rrent query.  Re
17a70 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
17a80 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65  can be and false
17a90 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
17aa0 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62  ic int whereUsab
17ab0 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
17ac0 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c  nt iTab, WhereCl
17ad0 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
17ae0 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *pWhere){.  int 
17af0 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  i;.  WhereTerm *
17b00 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20  pTerm;.  while( 
17b10 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
17b20 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77  ND ){.    if( !w
17b30 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
17b40 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c  lIndex(iTab,pWC,
17b50 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29  pWhere->pLeft) )
17b60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
17b70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
17b80 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f  pRight;.  }.  fo
17b90 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
17ba0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
17bb0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
17bc0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
17bd0 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
17be0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
17bf0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
17c00 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20  (pExpr, pWhere, 
17c10 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28  iTab) .     && (
17c20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
17c30 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
17c40 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
17c50 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
17c60 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20  iTab).    ){.   
17c70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17c80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17c90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
17ca0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
17cb0 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
17cc0 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
17cd0 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
17ce0 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74  able.** is ident
17cf0 69 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  ified by pBuilde
17d00 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
17d10 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
17d20 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
17d30 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
17d40 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
17d50 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
17d60 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f   costs (WhereLoo
17d70 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62  p.rRun) of the b
17d80 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65  -tree loops adde
17d90 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
17da0 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c  on.** are calcul
17db0 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
17dc0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c  .**.** For a ful
17dd0 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67  l scan, assuming
17de0 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69   the table (or i
17df0 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e  ndex) contains n
17e00 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20  Row rows:.**.** 
17e10 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
17e20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20  * 3.0           
17e30 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c           // full
17e40 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20  -table scan.**  
17e50 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
17e60 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   K              
17e70 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
17e80 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  of covering inde
17e90 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
17ea0 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20  nRow * (K+3.0)  
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
17ec0 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76   scan of non-cov
17ed0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
17ee0 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76  * where K is a v
17ef0 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31  alue between 1.1
17f00 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73   and 3.0 set bas
17f10 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69  ed on the relati
17f20 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ve .** estimated
17f30 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
17f40 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
17f50 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  able records..**
17f60 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78  .** For an index
17f70 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69   scan, where nVi
17f80 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  sit is the numbe
17f90 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20  r of index rows 
17fa0 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68  visited.** by th
17fb0 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65  e scan, and nSee
17fc0 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  k is the number 
17fd0 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  of seek operatio
17fe0 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a  ns required on .
17ff0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74  ** the index b-t
18000 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ree:.**.**     c
18010 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c  ost = nSeek * (l
18020 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e  og(nRow) + K * n
18030 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20  Visit)          
18040 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  // covering inde
18050 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  x.**     cost = 
18060 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
18070 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e  w) + (K+3.0) * n
18080 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e  Visit)    // non
18090 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
180a0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
180b0 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65  nSeek is 1. nSee
180c0 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72  k values greater
180d0 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f   than 1 come abo
180e0 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48  ut if the .** WH
180f0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75  ERE clause inclu
18100 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29  des "x IN (....)
18110 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20  " terms used in 
18120 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20  place of "x=?". 
18130 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c  Or when .** impl
18140 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45  icit "x IN (SELE
18150 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20  CT x FROM tbl)" 
18160 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
18170 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a  for skip-scans..
18180 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
18190 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77  ted values (nRow
181a0 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29  , nVisit, nSeek)
181b0 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61   often contain a
181c0 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a   large amount.**
181d0 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e   of uncertainty.
181e0 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
181f0 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65  n, scoring is de
18200 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70  signed to pick p
18210 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f  lans that.** "do
18220 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22   the least harm"
18230 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65   if the estimate
18240 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65  s are inaccurate
18250 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
18260 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66  a.** log(nRow) f
18270 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64  actor is omitted
18280 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65   from a non-cove
18290 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20  ring index scan 
182a0 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62  in order to.** b
182b0 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20  ias the scoring 
182c0 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e  in favor of usin
182d0 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63  g an index, sinc
182e0 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  e the worst-case
182f0 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
18300 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
18310 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20  x is far better 
18320 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63  than the worst-c
18330 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ase performance.
18340 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62  ** of a full tab
18350 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74  le scan..*/.stat
18360 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
18370 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72  AddBtree(.  Wher
18380 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
18390 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45  uilder, /* WHERE
183a0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
183b0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
183c0 20 6d 50 72 65 72 65 71 20 20 20 20 20 20 20 20   mPrereq        
183d0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72       /* Extra pr
183e0 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20  erequesites for 
183f0 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  using this table
18400 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e   */.){.  WhereIn
18410 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
18420 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
18430 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
18440 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
18450 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18460 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
18470 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
18480 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20  .  Index sPk;   
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
184a0 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f  * A fake index o
184b0 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72  bject for the pr
184c0 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c  imary key */.  L
184d0 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b  ogEst aiRowEstPk
184e0 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  [2];       /* Th
184f0 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20  e aiRowLogEst[] 
18500 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50  value for the sP
18510 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36  k index */.  i16
18520 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31   aiColumnPk = -1
18530 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
18540 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20  aColumn[] value 
18550 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
18560 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  x */.  SrcList *
18570 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  pTabList;       
18580 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
18590 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
185a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
185b0 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52  pSrc;  /* The FR
185c0 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20  OM clause btree 
185d0 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20  term to add */. 
185e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
185f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18600 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f  Template WhereLo
18610 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
18620 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18630 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  K;         /* Re
18640 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
18650 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b  nt iSortIdx = 1;
18660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18670 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
18680 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20  int b;          
18690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
186a0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a   boolean value *
186b0 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65  /.  LogEst rSize
186c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
186d0 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* number of row
186e0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
186f0 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
18700 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
18710 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
18720 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
18730 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
18740 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
18750 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
18760 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57   /* The parsed W
18770 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18780 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187a0 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
187b0 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77  ied */.  .  pNew
187c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
187d0 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  w;.  pWInfo = pB
187e0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
187f0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49    pTabList = pWI
18800 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
18810 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74   pSrc = pTabList
18820 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
18830 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
18840 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70  >pTab;.  pWC = p
18850 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
18860 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
18870 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
18880 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  ;..  if( pSrc->p
18890 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  IBIndex ){.    /
188a0 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
188b0 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
188c0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
188d0 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
188e0 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
188f0 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  >pIBIndex;.  }el
18900 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  se if( !HasRowid
18910 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50  (pTab) ){.    pP
18920 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e  robe = pTab->pIn
18930 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
18940 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
18950 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18960 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
18970 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
18980 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
18990 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
189a0 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
189b0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
189c0 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
189d0 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
189e0 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
189f0 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
18a00 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
18a10 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
18a20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
18a30 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
18a40 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a60 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
18a70 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
18a80 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
18a90 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
18aa0 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
18ab0 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b  sPk.nKeyCol = 1;
18ac0 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
18ad0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
18ae0 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
18af0 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
18b00 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f  RowLogEst = aiRo
18b10 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
18b20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
18b30 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
18b40 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20  able = pTab;.   
18b50 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20   sPk.szIdxRow = 
18b60 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
18b70 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
18b80 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ] = pTab->nRowLo
18b90 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  gEst;.    aiRowE
18ba0 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  stPk[1] = 0;.   
18bb0 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
18bc0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
18bd0 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e    if( pSrc->fg.n
18be0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
18bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
18c00 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
18c10 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
18c20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
18c30 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
18c40 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
18c50 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
18c60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18c70 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
18c80 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
18c90 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
18ca0 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69   &sPk;.  }.  rSi
18cb0 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  ze = pTab->nRowL
18cc0 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a  ogEst;.  rLogSiz
18cd0 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
18ce0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
18cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
18d00 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74  C_INDEX.  /* Aut
18d10 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a  omatic indexes *
18d20 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65  /.  if( !pBuilde
18d30 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f  r->pOrSet      /
18d40 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  * Not part of an
18d50 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   OR optimization
18d60 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66   */.   && (pWInf
18d70 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
18d80 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
18d90 53 45 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57  SE)==0.   && (pW
18da0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
18db0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
18dc0 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
18dd0 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e    && pSrc->pIBIn
18de0 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48  dex==0      /* H
18df0 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  as no INDEXED BY
18e00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26   clause */.   &&
18e10 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e   !pSrc->fg.notIn
18e20 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e  dexed   /* Has n
18e30 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  o NOT INDEXED cl
18e40 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61  ause */.   && Ha
18e50 73 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20  sRowid(pTab)    
18e60 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48       /* Not WITH
18e70 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
18e80 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74   (FIXME: Why not
18e90 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72  ?) */.   && !pSr
18ea0 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  c->fg.isCorrelat
18eb0 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ed /* Not a corr
18ec0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
18ed0 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
18ee0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20  fg.isRecursive  
18ef0 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69  /* Not a recursi
18f00 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20  ve common table 
18f10 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20  expression. */. 
18f20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   ){.    /* Gener
18f30 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57  ate auto-index W
18f40 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20  hereLoops */.   
18f50 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
18f60 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  m;.    WhereTerm
18f70 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e   *pWCEnd = pWC->
18f80 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a  a + pWC->nTerm;.
18f90 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
18fa0 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45  C->a; rc==SQLITE
18fb0 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43  _OK && pTerm<pWC
18fc0 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
18fd0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
18fe0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
18ff0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
19000 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
19010 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
19020 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
19030 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
19040 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
19050 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  q = 1;.        p
19060 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
19070 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19080 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
19090 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
190a0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
190b0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
190c0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
190d0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
190e0 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f  One-time cost fo
190f0 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
19100 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
19110 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73  is.        ** es
19120 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a  timated to be X*
19130 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20  N*log2(N) where 
19140 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
19150 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20  of rows in.     
19160 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
19170 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e  being indexed an
19180 64 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28  d where X is 7 (
19190 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e  LogEst=28) for n
191a0 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ormal.        **
191b0 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35   tables or 1.375
191c0 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20   (LogEst=4) for 
191d0 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
191e0 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65  ries.  The value
191f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58  .        ** of X
19200 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20   is smaller for 
19210 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
19220 72 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ries so that the
19230 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20   query planner. 
19240 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
19250 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76  e more aggressiv
19260 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69  e about generati
19270 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  ng automatic ind
19280 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20  exes for.       
19290 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74   ** those object
192a0 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  s, since there i
192b0 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79  s no opportunity
192c0 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20   to add schema. 
192d0 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65         ** indexe
192e0 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20  s on subqueries 
192f0 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20  and views. */.  
19300 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
19310 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20  up = rLogSize + 
19320 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20  rSize + 4;.     
19330 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
19340 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62  lect==0 && (pTab
19350 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
19360 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b  Ephemeral)==0 ){
19370 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
19380 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20  >rSetup += 24;. 
19390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
193a0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
193b0 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75  lier(pNew->rSetu
193c0 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  p, pTab->costMul
193d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
193e0 70 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30 20 29  pNew->rSetup<0 )
193f0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
19400 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  0;.        /* TU
19410 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78  NING: Each index
19420 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32   lookup yields 2
19430 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  0 rows in the ta
19440 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20  ble.  This.     
19450 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68     ** is more th
19460 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65  an the usual gue
19470 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73  ss of 10 rows, s
19480 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20  ince we have no 
19490 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  way.        ** o
194a0 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65  f knowing how se
194b0 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  lective the inde
194c0 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  x will ultimatel
194d0 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a  y be.  It would.
194e0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
194f0 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74  e unreasonable t
19500 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75  o make this valu
19510 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a  e much larger. *
19520 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
19530 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65  nOut = 43;  asse
19540 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 43==sqlite3L
19550 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20  ogEst(20) );.   
19560 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
19570 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
19580 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77  dd(rLogSize,pNew
19590 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  ->nOut);.       
195a0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
195b0 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
195c0 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  X;.        pNew-
195d0 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
195e0 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
195f0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
19600 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
19610 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
19620 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
19630 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
19640 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
19650 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
19660 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
19670 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a   all indices.  *
19680 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51  /.  for(; rc==SQ
19690 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62  LITE_OK && pProb
196a0 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  e; pProbe=pProbe
196b0 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64  ->pNext, iSortId
196c0 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  x++){.    if( pP
196d0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
196e0 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21  ere!=0.     && !
196f0 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
19700 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43  alIndex(pSrc->iC
19710 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f  ursor, pWC, pPro
19720 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  be->pPartIdxWher
19730 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  e) ){.      test
19740 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62  case( pNew->iTab
19750 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
19760 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65  );  /* See ticke
19770 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a  t [98d973b8f5] *
19780 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
19790 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e  ;  /* Partial in
197a0 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74  dex inappropriat
197b0 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
197c0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53   */.    }.    rS
197d0 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
197e0 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
197f0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
19800 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  nEq = 0;.    pNe
19810 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20  w->u.btree.nBtm 
19820 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
19830 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b  .btree.nTop = 0;
19840 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
19850 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19860 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  nLTerm = 0;.    
19870 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
19880 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53   0;.    pNew->rS
19890 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  etup = 0;.    pN
198a0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72  ew->prereq = mPr
198b0 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ereq;.    pNew->
198c0 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
198d0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
198e0 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b  pIndex = pProbe;
198f0 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69  .    b = indexMi
19900 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
19910 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72  By(pBuilder, pPr
19920 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  obe, pSrc->iCurs
19930 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  or);.    /* The 
19940 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
19950 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75  flags never occu
19960 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  rs together with
19970 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
19980 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f   assert( (pWInfo
19990 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
199a0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
199b0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30  IRED)==0 || b==0
199c0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   );.    if( pPro
199d0 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20  be->tnum<=0 ){. 
199e0 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
199f0 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
19a00 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  x */.      pNew-
19a10 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
19a20 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  _IPK;..      /* 
19a30 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  Full table scan 
19a40 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  */.      pNew->i
19a50 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
19a60 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20  ortIdx : 0;.    
19a70 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
19a80 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20  t of full table 
19a90 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e  scan is (N*3.0).
19aa0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
19ab0 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31  rRun = rSize + 1
19ac0 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f  6;.      ApplyCo
19ad0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
19ae0 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
19af0 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
19b00 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
19b10 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
19b20 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72   rSize);.      r
19b30 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
19b40 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
19b50 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ew);.      pNew-
19b60 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
19b70 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
19b80 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
19b90 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b        Bitmask m;
19ba0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62  .      if( pProb
19bb0 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b  e->isCovering ){
19bc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
19bd0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49  sFlags = WHERE_I
19be0 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
19bf0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20  INDEXED;.       
19c00 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   m = 0;.      }e
19c10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d  lse{.        m =
19c20 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
19c30 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78   ~columnsInIndex
19c40 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20  (pProbe);.      
19c50 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
19c60 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
19c70 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
19c80 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
19c90 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
19ca0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c   }..      /* Ful
19cb0 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78  l scan via index
19cc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a   */.      if( b.
19cd0 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f         || !HasRo
19ce0 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20  wid(pTab).      
19cf0 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72   || pProbe->pPar
19d00 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
19d10 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
19d20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
19d30 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
19d40 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
19d50 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
19d60 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
19d70 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
19d80 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
19d90 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
19da0 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
19db0 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
19dc0 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
19dd0 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
19de0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
19df0 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
19e00 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
19e10 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
19e20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
19e30 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
19e40 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
19e50 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
19e60 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
19e70 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
19e80 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
19e90 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
19ea0 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
19eb0 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
19ec0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
19ed0 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
19ee0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
19ef0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
19f00 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rows. */.       
19f10 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53   pNew->rRun = rS
19f20 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50  ize + 1 + (15*pP
19f30 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f  robe->szIdxRow)/
19f40 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
19f50 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30          if( m!=0
19f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
19f70 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f   If this is a no
19f80 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
19f90 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20 74 68   scan, add in th
19fa0 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 20 20  e cost of.      
19fb0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62      ** doing tab
19fc0 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65  le lookups.  The
19fd0 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20 33 78   cost will be 3x
19fe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
19ff0 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b           ** look
1a000 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20  ups.  Take into 
1a010 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20 63 6c  account WHERE cl
1a020 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
1a030 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20  can be.         
1a040 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73   ** satisfied us
1a050 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
1a060 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64 6f 20  ex, and that do 
1a070 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 20 20  not require a.  
1a080 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
1a090 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20   lookup. */.    
1a0a0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f        LogEst nLo
1a0b0 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b 20 31  okup = rSize + 1
1a0c0 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f 73 74  6;  /* Base cost
1a0d0 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20  :  N*3 */.      
1a0e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1a0f0 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
1a100 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a   pSrc->iCursor;.
1a110 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
1a120 6c 61 75 73 65 20 2a 70 57 43 32 20 3d 20 26 70  lause *pWC2 = &p
1a130 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20  WInfo->sWC;.    
1a140 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1a150 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20  ii<pWC2->nTerm; 
1a160 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
1a170 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1a180 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69  erm = &pWC2->a[i
1a190 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
1a1a0 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
1a1b0 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 70  CoveredByIndex(p
1a1c0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75  Term->pExpr, iCu
1a1d0 72 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  r, pProbe) ){.  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1a1f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1a200 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1a210 70 54 65 72 6d 20 63 61 6e 20 62 65 20 65 76 61  pTerm can be eva
1a220 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6a 75 73  luated using jus
1a230 74 20 74 68 65 20 69 6e 64 65 78 2e 20 20 53 6f  t the index.  So
1a240 20 72 65 64 75 63 65 0a 20 20 20 20 20 20 20 20   reduce.        
1a250 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 63      ** the expec
1a260 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  ted number of ta
1a270 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f  ble lookups acco
1a280 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20  rdingly */.     
1a290 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1a2a0 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
1a2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a2c0 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d  nLookup += pTerm
1a2d0 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
1a2e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
1a300 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20  ookup--;.       
1a310 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1a320 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1a330 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c  O_EQ|WO_IS) ) nL
1a340 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20  ookup -= 19;.   
1a350 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a370 20 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77   .          pNew
1a380 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
1a390 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
1a3a0 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a  rRun, nLookup);.
1a3b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a3c0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
1a3d0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
1a3e0 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
1a3f0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1a400 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74  LoopOutputAdjust
1a410 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  (pWC, pNew, rSiz
1a420 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
1a430 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1a440 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1a450 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1a460 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
1a470 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
1a480 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a490 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68    }..    rc = wh
1a4a0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
1a4b0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
1a4c0 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b  Src, pProbe, 0);
1a4d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a4e0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
1a4f0 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33  TAT4.    sqlite3
1a500 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70  Stat4ProbeFree(p
1a510 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a  Builder->pRec);.
1a520 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
1a530 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  ecValid = 0;.   
1a540 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
1a550 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
1a560 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1a570 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
1a580 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
1a590 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
1a5a0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
1a5b0 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
1a5c0 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20   pSrc->pIBIndex 
1a5d0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
1a5e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1a5f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a600 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f  _VIRTUALTABLE../
1a610 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
1a620 64 78 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64  dxInfo is alread
1a630 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  y populated with
1a640 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1a650 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20   that may.** be 
1a660 75 73 65 64 20 62 79 20 74 68 65 20 76 69 72 74  used by the virt
1a670 75 61 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69  ual table identi
1a680 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
1a690 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68  ->pNew->iTab. Th
1a6a0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  is.** function m
1a6b0 61 72 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66  arks a subset of
1a6c0 20 74 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e   those constrain
1a6d0 74 73 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b  ts usable, invok
1a6e0 65 73 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49  es the.** xBestI
1a6f0 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20  ndex method and 
1a700 61 64 64 73 20 74 68 65 20 72 65 74 75 72 6e 65  adds the returne
1a710 64 20 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64  d plan to pBuild
1a720 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73  er..**.** A cons
1a730 74 72 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64  traint is marked
1a740 20 75 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a   usable if:.**.*
1a750 2a 20 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d  *   * Argument m
1a760 55 73 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73  Usable indicates
1a770 20 74 68 61 74 20 69 74 73 20 70 72 65 72 65 71   that its prereq
1a780 75 69 73 69 74 65 73 20 61 72 65 20 61 76 61 69  uisites are avai
1a790 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  lable, and.**.**
1a7a0 20 20 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f     * It is not o
1a7b0 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
1a7c0 6f 72 73 20 73 70 65 63 69 66 69 65 64 20 69 6e  ors specified in
1a7d0 20 74 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61   the mExclude ma
1a7e0 73 6b 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20  sk passed.**    
1a7f0 20 61 73 20 74 68 65 20 66 6f 75 72 74 68 20 61   as the fourth a
1a800 72 67 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69  rgument (which i
1a810 6e 20 70 72 61 63 74 69 63 65 20 69 73 20 65 69  n practice is ei
1a820 74 68 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29  ther WO_IN or 0)
1a830 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
1a840 20 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61   mPrereq is a ma
1a850 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
1a860 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
1a870 64 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20  d before the.** 
1a880 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
1a890 20 71 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65   question. These
1a8a0 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
1a8b0 65 20 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69  e plans prerequi
1a8c0 73 69 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  sites.** before 
1a8d0 69 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 70  it is added to p
1a8e0 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f  Builder..**.** O
1a8f0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
1a900 2a 70 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20  *pbIn is set to 
1a910 74 72 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e  true if the plan
1a920 20 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64   added to pBuild
1a930 65 72 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f  er.** uses one o
1a940 72 20 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72  r more WO_IN ter
1a950 6d 73 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  ms, or false oth
1a960 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1a970 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1a980 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1a990 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1a9a0 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69   *pBuilder,.  Bi
1a9b0 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20  tmask mPrereq,  
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9d0 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20   Mask of tables 
1a9e0 74 68 61 74 20 6d 75 73 74 20 62 65 20 75 73 65  that must be use
1a9f0 64 2e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  d. */.  Bitmask 
1aa00 6d 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20  mUsable,        
1aa10 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1aa20 6f 66 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73  of usable tables
1aa30 20 2a 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75   */.  u16 mExclu
1aa40 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
1aa50 20 20 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65        /* Exclude
1aa60 20 74 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65   terms using the
1aa70 73 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  se operators */.
1aa80 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1aa90 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20  info *pIdxInfo, 
1aaa0 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f    /* Populated o
1aab0 62 6a 65 63 74 20 66 6f 72 20 78 42 65 73 74 49  bject for xBestI
1aac0 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e  ndex */.  u16 mN
1aad0 6f 4f 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20  oOmit,          
1aae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1aaf0 6e 6f 74 20 6f 6d 69 74 20 74 68 65 73 65 20 63  not omit these c
1ab00 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
1ab10 69 6e 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20  int *pbIn       
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab30 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
1ab40 70 6c 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28  plan uses an IN(
1ab50 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ...) op */.){.  
1ab60 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1ab70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1ab80 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
1ab90 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1aba0 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
1abb0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
1abc0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1abd0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d  _usage *pUsage =
1abe0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
1abf0 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69  traintUsage;.  i
1ac00 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65  nt i;.  int mxTe
1ac10 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  rm;.  int rc = S
1ac20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
1ac30 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42  eLoop *pNew = pB
1ac40 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1ac50 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1ac60 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1ac70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75  ->pParse;.  stru
1ac80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ac90 2a 70 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65  *pSrc = &pBuilde
1aca0 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  r->pWInfo->pTabL
1acb0 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61  ist->a[pNew->iTa
1acc0 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  b];.  int nConst
1acd0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
1ace0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->nConstraint;..
1acf0 20 20 61 73 73 65 72 74 28 20 28 6d 55 73 61 62    assert( (mUsab
1ad00 6c 65 20 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d  le & mPrereq)==m
1ad10 50 72 65 72 65 71 20 29 3b 0a 20 20 2a 70 62 49  Prereq );.  *pbI
1ad20 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  n = 0;.  pNew->p
1ad30 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b  rereq = mPrereq;
1ad40 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75  ..  /* Set the u
1ad50 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68  sable flag on th
1ad60 65 20 73 75 62 73 65 74 20 6f 66 20 63 6f 6e 73  e subset of cons
1ad70 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69  traints identifi
1ad80 65 64 20 62 79 20 0a 20 20 2a 2a 20 61 72 67 75  ed by .  ** argu
1ad90 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65 20 61 6e  ments mUsable an
1ada0 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20  d mExclude. */. 
1adb0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
1adc0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1add0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
1ade0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
1adf0 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d  traint;.  for(i=
1ae00 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1ae10 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
1ae20 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72  +){.    WhereTer
1ae30 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
1ae40 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65  >a[pIdxCons->iTe
1ae50 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70  rmOffset];.    p
1ae60 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
1ae70 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 70 54  = 0;.    if( (pT
1ae80 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1ae90 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65   & mUsable)==pTe
1aea0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
1aeb0 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1aec0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 45 78  >eOperator & mEx
1aed0 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b  clude)==0.    ){
1aee0 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  .      pIdxCons-
1aef0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
1af00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69   }.  }..  /* Ini
1af10 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
1af20 75 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ut fields of the
1af30 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1af40 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f  nfo structure */
1af50 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
1af60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
1af70 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69  ge[0])*nConstrai
1af80 6e 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nt);.  assert( p
1af90 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1afa0 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a  reeIdxStr==0 );.
1afb0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
1afc0 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
1afd0 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
1afe0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
1aff0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
1b000 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
1b010 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
1b020 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
1b030 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49 64 78 49  ouble)2;.  pIdxI
1b040 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
1b050 77 73 20 3d 20 32 35 3b 0a 20 20 70 49 64 78 49  ws = 25;.  pIdxI
1b060 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20  nfo->idxFlags = 
1b070 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63  0;.  pIdxInfo->c
1b080 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65  olUsed = (sqlite
1b090 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f  3_int64)pSrc->co
1b0a0 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76  lUsed;..  /* Inv
1b0b0 6f 6b 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  oke the virtual 
1b0c0 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78  table xBestIndex
1b0d0 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72  () method */.  r
1b0e0 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65  c = vtabBestInde
1b0f0 78 28 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e  x(pParse, pSrc->
1b100 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
1b110 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1b120 72 6e 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d  rn rc;..  mxTerm
1b130 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28   = -1;.  assert(
1b140 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e   pNew->nLSlot>=n
1b150 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20  Constraint );.  
1b160 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1b170 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
1b180 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
1b190 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1b1a0 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
1b1b0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
1b1c0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1b1d0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
1b1e0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
1b1f0 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d  traint;.  for(i=
1b200 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1b210 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
1b220 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72  +){.    int iTer
1b230 6d 3b 0a 20 20 20 20 69 66 28 20 28 69 54 65 72  m;.    if( (iTer
1b240 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72  m = pUsage[i].ar
1b250 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20  gvIndex - 1)>=0 
1b260 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
1b270 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20  rm *pTerm;.     
1b280 20 69 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e   int j = pIdxCon
1b290 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
1b2a0 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
1b2b0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  =nConstraint.   
1b2c0 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20      || j<0.     
1b2d0 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65    || j>=pWC->nTe
1b2e0 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  rm.       || pNe
1b2f0 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
1b300 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  !=0.       || pI
1b310 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d  dxCons->usable==
1b320 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
1b330 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1b340 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 73 71  RROR;.        sq
1b350 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b360 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e  arse,"%s.xBestIn
1b370 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  dex malfunction"
1b380 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61  ,pSrc->pTab->zNa
1b390 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  me);.        ret
1b3a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b3b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b3c0 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69  iTerm==nConstrai
1b3d0 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  nt-1 );.      te
1b3e0 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a  stcase( j==0 );.
1b3f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b400 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20  j==pWC->nTerm-1 
1b410 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
1b420 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
1b430 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1b440 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  |= pTerm->prereq
1b450 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
1b460 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
1b470 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
1b480 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
1b490 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  erm] = pTerm;.  
1b4a0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
1b4b0 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
1b4c0 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 74 65 73  iTerm;.      tes
1b4d0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35  tcase( iTerm==15
1b4e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b4f0 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b  se( iTerm==16 );
1b500 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d  .      if( iTerm
1b510 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d  <16 && pUsage[i]
1b520 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e  .omit ) pNew->u.
1b530 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d  vtab.omitMask |=
1b540 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20   1<<iTerm;.     
1b550 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
1b560 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
1b570 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1b580 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
1b590 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
1b5a0 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c  ined by an IN cl
1b5b0 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20  ause may not.   
1b5c0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20       ** consume 
1b5d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1b5e0 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20  use because (1) 
1b5f0 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
1b600 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a  terms.        **
1b610 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1b620 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
1b630 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70  he order of outp
1b640 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20  ut terms and.   
1b650 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
1b660 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
1b670 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
1b680 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
1b690 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
1b6a0 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20  gether.  */.    
1b6b0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
1b6c0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
1b6d0 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 49  0;.        pIdxI
1b6e0 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d  nfo->idxFlags &=
1b6f0 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53   ~SQLITE_INDEX_S
1b700 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  CAN_UNIQUE;.    
1b710 20 20 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61      *pbIn = 1; a
1b720 73 73 65 72 74 28 20 28 6d 45 78 63 6c 75 64 65  ssert( (mExclude
1b730 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a   & WO_IN)==0 );.
1b740 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b750 7d 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  }.  pNew->u.vtab
1b760 2e 6f 6d 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e  .omitMask &= ~mN
1b770 6f 4f 6d 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e  oOmit;..  pNew->
1b780 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b  nLTerm = mxTerm+
1b790 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  1;.  assert( pNe
1b7a0 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d  w->nLTerm<=pNew-
1b7b0 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65  >nLSlot );.  pNe
1b7c0 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  w->u.vtab.idxNum
1b7d0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
1b7e0 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  Num;.  pNew->u.v
1b7f0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
1b800 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1b810 72 65 65 49 64 78 53 74 72 3b 0a 20 20 70 49 64  reeIdxStr;.  pId
1b820 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1b830 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
1b840 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
1b850 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69  tr = pIdxInfo->i
1b860 64 78 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75  dxStr;.  pNew->u
1b870 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
1b880 3d 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d  = (i8)(pIdxInfo-
1b890 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1b8a0 20 3f 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66   ?.      pIdxInf
1b8b0 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29  o->nOrderBy : 0)
1b8c0 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
1b8d0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52   = 0;.  pNew->rR
1b8e0 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
1b8f0 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64  stFromDouble(pId
1b900 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
1b910 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Cost);.  pNew->n
1b920 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Out = sqlite3Log
1b930 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  Est(pIdxInfo->es
1b940 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20  timatedRows);.. 
1b950 20 2f 2a 20 53 65 74 20 74 68 65 20 57 48 45 52   /* Set the WHER
1b960 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66  E_ONEROW flag if
1b970 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
1b980 29 20 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74  ) method indicat
1b990 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
1b9a0 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
1b9b0 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77   at most one row
1b9c0 2e 20 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72  . Clear it other
1b9d0 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  wise. */.  if( p
1b9e0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
1b9f0 73 20 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  s & SQLITE_INDEX
1ba00 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a  _SCAN_UNIQUE ){.
1ba10 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1ba20 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
1ba30 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  W;.  }else{.    
1ba40 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d  pNew->wsFlags &=
1ba50 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a   ~WHERE_ONEROW;.
1ba60 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65    }.  rc = where
1ba70 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1ba80 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66  der, pNew);.  if
1ba90 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e  ( pNew->u.vtab.n
1baa0 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73  eedFree ){.    s
1bab0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1bac0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
1bad0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74  ;.    pNew->u.vt
1bae0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
1baf0 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
1bb00 45 28 30 78 66 66 66 66 2c 20 28 22 20 20 62 49  E(0xffff, ("  bI
1bb10 6e 3d 25 64 20 70 72 65 72 65 71 49 6e 3d 25 30  n=%d prereqIn=%0
1bb20 34 6c 6c 78 20 70 72 65 72 65 71 4f 75 74 3d 25  4llx prereqOut=%
1bb30 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  04llx\n",.      
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 2a 70 62 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f  *pbIn, (sqlite3_
1bb60 75 69 6e 74 36 34 29 6d 50 72 65 72 65 71 2c 0a  uint64)mPrereq,.
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75        (sqlite3_u
1bb90 69 6e 74 36 34 29 28 70 4e 65 77 2d 3e 70 72 65  int64)(pNew->pre
1bba0 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29  req & ~mPrereq))
1bbb0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1bbc0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
1bbd0 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
1bbe0 65 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ects for a table
1bbf0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65   of the join ide
1bc00 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42  ntified by.** pB
1bc10 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
1bc20 61 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  ab.  That table 
1bc30 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1bc40 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61   be a virtual ta
1bc50 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
1bc60 65 72 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20  ere are no LEFT 
1bc70 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f  or CROSS JOIN jo
1bc80 69 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  ins in the query
1bc90 2c 20 62 6f 74 68 20 6d 50 72 65 72 65 71 20 61  , both mPrereq a
1bca0 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20  nd.** mUnusable 
1bcb0 61 72 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74  are set to 0. Ot
1bcc0 68 65 72 77 69 73 65 2c 20 6d 50 72 65 72 65 71  herwise, mPrereq
1bcd0 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c   is a mask of al
1bce0 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  l FROM clause.**
1bcf0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63   entries that oc
1bd00 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 76  cur before the v
1bd10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20  irtual table in 
1bd20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bd30 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72  and are.** separ
1bd40 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20  ated from it by 
1bd50 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46  at least one LEF
1bd60 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e  T or CROSS JOIN.
1bd70 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a   Similarly, the.
1bd80 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73  ** mUnusable mas
1bd90 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46  k contains all F
1bda0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69  ROM clause entri
1bdb0 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 61 66  es that occur af
1bdc0 74 65 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ter the.** virtu
1bdd0 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65  al table and are
1bde0 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
1bdf0 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f  it by at least o
1be00 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43  ne LEFT or .** C
1be10 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a  ROSS JOIN. .**.*
1be20 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
1be30 66 20 74 68 65 20 71 75 65 72 79 20 77 65 72 65  f the query were
1be40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
1be50 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a  OM t1, t2 LEFT J
1be60 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43  OIN t3, t4, vt C
1be70 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36  ROSS JOIN t5, t6
1be80 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72  ;.**.** then mPr
1be90 65 72 65 71 20 63 6f 72 72 65 73 70 6f 6e 64 73  ereq corresponds
1bea0 20 74 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64   to (t1, t2) and
1beb0 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74   mUnusable to (t
1bec0 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c  5, t6)..**.** Al
1bed0 6c 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  l the tables in 
1bee0 6d 50 72 65 72 65 71 20 6d 75 73 74 20 62 65 20  mPrereq must be 
1bef0 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
1bf00 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74 75  he current virtu
1bf10 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f  al .** table. So
1bf20 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77   any terms for w
1bf30 68 69 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75  hich all prerequ
1bf40 69 73 69 74 65 73 20 61 72 65 20 73 61 74 69 73  isites are satis
1bf50 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65  fied by .** mPre
1bf60 72 65 71 20 6d 61 79 20 62 65 20 73 70 65 63 69  req may be speci
1bf70 66 69 65 64 20 61 73 20 22 75 73 61 62 6c 65 22  fied as "usable"
1bf80 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f   in all calls to
1bf90 20 78 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a   xBestIndex. .**
1bfa0 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c   Conversely, all
1bfb0 20 74 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73   tables in mUnus
1bfc0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61  able must be sca
1bfd0 6e 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 63  nned after the c
1bfe0 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61  urrent.** virtua
1bff0 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20  l table, so any 
1c000 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20  terms for which 
1c010 74 68 65 20 70 72 65 72 65 71 75 69 73 69 74 65  the prerequisite
1c020 73 20 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a  s overlap with.*
1c030 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75  * mUnusable shou
1c040 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e  ld always be con
1c050 66 69 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d  figured as "not-
1c060 75 73 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73  usable" for xBes
1c070 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69  tIndex..*/.stati
1c080 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1c090 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65  ddVirtual(.  Whe
1c0a0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
1c0b0 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45  Builder,  /* WHE
1c0c0 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d  RE clause inform
1c0d0 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ation */.  Bitma
1c0e0 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20  sk mPrereq,     
1c0f0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1c100 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73  s that must be s
1c110 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68  canned before th
1c120 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  is one */.  Bitm
1c130 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20  ask mUnusable   
1c140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1c150 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
1c160 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68  scanned after th
1c170 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69  is one */.){.  i
1c180 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c190 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
1c1a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1c1b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1c1c0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
1c1d0 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
1c1e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
1c1f0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
1c200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c210 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1c220 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
1c230 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
1c240 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1c250 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1c260 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1c270 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  pSrc;   /* The F
1c280 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
1c290 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 73  to search */.  s
1c2a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1c2b0 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f  o *p;       /* O
1c2c0 62 6a 65 63 74 20 74 6f 20 70 61 73 73 20 74 6f  bject to pass to
1c2d0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 2a 2f   xBestIndex() */
1c2e0 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
1c2f0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1c300 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
1c310 73 74 72 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f  straints in p */
1c320 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20 20 20 20  .  int bIn;     
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c340 2f 2a 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20  /* True if plan 
1c350 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65  uses IN(...) ope
1c360 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65  rator */.  Where
1c370 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69  Loop *pNew;.  Bi
1c380 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20 20 20 20  tmask mBest;    
1c390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1c3a0 62 6c 65 73 20 75 73 65 64 20 62 79 20 62 65 73  bles used by bes
1c3b0 74 20 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20  t possible plan 
1c3c0 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  */.  u16 mNoOmit
1c3d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 50  ;..  assert( (mP
1c3e0 72 65 72 65 71 20 26 20 6d 55 6e 75 73 61 62 6c  rereq & mUnusabl
1c3f0 65 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66  e)==0 );.  pWInf
1c400 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
1c410 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
1c420 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
1c430 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
1c440 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d  r->pWC;.  pNew =
1c450 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
1c460 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66  .  pSrc = &pWInf
1c470 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1c480 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73  New->iTab];.  as
1c490 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
1c4a0 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20  pSrc->pTab) );. 
1c4b0 20 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64   p = allocateInd
1c4c0 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
1c4d0 57 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70  WC, mUnusable, p
1c4e0 53 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Src, pBuilder->p
1c4f0 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
1c500 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28  &mNoOmit);.  if(
1c510 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1c520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1c530 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  ;.  pNew->rSetup
1c540 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73   = 0;.  pNew->ws
1c550 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
1c560 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e  RTUALTABLE;.  pN
1c570 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
1c580 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1c590 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e  eedFree = 0;.  n
1c5a0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e  Constraint = p->
1c5b0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69  nConstraint;.  i
1c5c0 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
1c5d0 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
1c5e0 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
1c5f0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1c600 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1c610 62 2c 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72  b, p);.    retur
1c620 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1c630 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  KPT;.  }..  /* F
1c640 69 72 73 74 20 63 61 6c 6c 20 78 42 65 73 74 49  irst call xBestI
1c650 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1c660 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62  constraints usab
1c670 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54 52  le. */.  WHERETR
1c680 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1c690 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73  rtualOne: all us
1c6a0 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20  able\n"));.  rc 
1c6b0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1c6c0 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65  rtualOne(pBuilde
1c6d0 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42  r, mPrereq, ALLB
1c6e0 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d  ITS, 0, p, mNoOm
1c6f0 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a  it, &bIn);..  /*
1c700 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
1c710 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69 74  xBestIndex() wit
1c720 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62  h all terms enab
1c730 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61 20 70  led produced a p
1c740 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f  lan.  ** that do
1c750 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
1c760 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  ny source tables
1c770 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69   (IOW: a plan wi
1c780 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20 20  th mBest==0),.  
1c790 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
1c7a0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b   no point in mak
1c7b0 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65 72 20  ing any further 
1c7c0 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e  calls to xBestIn
1c7d0 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e 63  dex() .  ** sinc
1c7e0 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20  e they will all 
1c7f0 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
1c800 72 65 73 75 6c 74 20 28 69 66 20 74 68 65 20 78  result (if the x
1c810 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20 2a 2a  BestIndex().  **
1c820 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1c830 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69  is sane). */.  i
1c840 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c850 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28 70 4e   && (mBest = (pN
1c860 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50  ew->prereq & ~mP
1c870 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a 20 20  rereq))!=0 ){.  
1c880 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d    int seenZero =
1c890 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c8a0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 6c 61  /* True if a pla
1c8b0 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71  n with no prereq
1c8c0 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  s seen */.    in
1c8d0 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d  t seenZeroNoIN =
1c8e0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
1c8f0 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72  lan with no prer
1c900 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e  eqs and no IN(..
1c910 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42  .) seen */.    B
1c920 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20 30  itmask mPrev = 0
1c930 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 42  ;.    Bitmask mB
1c940 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20  estNoIn = 0;..  
1c950 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c 61 6e    /* If the plan
1c960 20 70 72 6f 64 75 63 65 64 20 62 79 20 74 68 65   produced by the
1c970 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 75 73   earlier call us
1c980 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65  es an IN(...) te
1c990 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rm, call.    ** 
1c9a0 78 42 65 73 74 49 6e 64 65 78 20 61 67 61 69 6e  xBestIndex again
1c9b0 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69 74 68  , this time with
1c9c0 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64   IN(...) terms d
1c9d0 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20  isabled. */.    
1c9e0 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20 20 20  if( bIn ){.     
1c9f0 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1ca00 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1ca10 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f  : all usable w/o
1ca20 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20   IN\n"));.      
1ca30 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1ca40 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20  dVirtualOne(.   
1ca50 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c         pBuilder,
1ca60 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1ca70 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f  S, WO_IN, p, mNo
1ca80 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20  Omit, &bIn);.   
1ca90 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 3d 3d     assert( bIn==
1caa0 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73 74  0 );.      mBest
1cab0 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65  NoIn = pNew->pre
1cac0 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a  req & ~mPrereq;.
1cad0 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74 4e        if( mBestN
1cae0 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oIn==0 ){.      
1caf0 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a    seenZero = 1;.
1cb00 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f          seenZero
1cb10 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  NoIN = 1;.      
1cb20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1cb30 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20  Call xBestIndex 
1cb40 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 64 69  once for each di
1cb50 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20  stinct value of 
1cb60 28 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e  (prereqRight & ~
1cb70 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20 2a 2a  mPrereq) .    **
1cb80 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 74   in the set of t
1cb90 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c 79 20  erms that apply 
1cba0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  to the current v
1cbb0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a  irtual table.  *
1cbc0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  /.    while( rc=
1cbd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cbe0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1cbf0 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d   Bitmask mNext =
1cc00 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20 20   ALLBITS;.      
1cc10 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e 30 20  assert( mNext>0 
1cc20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1cc30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
1cc40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42   i++){.        B
1cc50 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20 28  itmask mThis = (
1cc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57 43  .            pWC
1cc70 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69  ->a[p->aConstrai
1cc80 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
1cc90 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 20 26  t].prereqRight &
1cca0 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20 20 20   ~mPrereq.      
1ccb0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1ccc0 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26 26 20   mThis>mPrev && 
1ccd0 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e  mThis<mNext ) mN
1cce0 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20  ext = mThis;.   
1ccf0 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72 65 76     }.      mPrev
1cd00 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20   = mNext;.      
1cd10 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49  if( mNext==ALLBI
1cd20 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  TS ) break;.    
1cd30 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65    if( mNext==mBe
1cd40 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65  st || mNext==mBe
1cd50 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75  stNoIn ) continu
1cd60 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  e;.      WHERETR
1cd70 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1cd80 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d  rtualOne: mPrev=
1cd90 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34  %04llx mNext=%04
1cda0 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llx\n",.        
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1cdc0 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d  sqlite3_uint64)m
1cdd0 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33 5f 75  Prev, (sqlite3_u
1cde0 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20  int64)mNext));. 
1cdf0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1ce00 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1ce10 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69  (.          pBui
1ce20 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1ce30 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c  Next|mPrereq, 0,
1ce40 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1ce50 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  n);.      if( pN
1ce60 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65  ew->prereq==mPre
1ce70 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 73  req ){.        s
1ce80 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20  eenZero = 1;.   
1ce90 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20       if( bIn==0 
1cea0 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d  ) seenZeroNoIN =
1ceb0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1cec0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1ced0 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1cee0 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20 61 62  ndex() in the ab
1cef0 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74  ove loop did not
1cf00 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20   find a plan.   
1cf10 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65   ** that require
1cf20 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c  s no source tabl
1cf30 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20  es at all (i.e. 
1cf40 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  one guaranteed t
1cf50 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73 61 62  o be.    ** usab
1cf60 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c  le), make a call
1cf70 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c 20 73   here with all s
1cf80 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64 69 73  ource tables dis
1cf90 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  abled */.    if(
1cfa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1cfb0 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b  & seenZero==0 ){
1cfc0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1cfd0 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1cfe0 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61  ualOne: all disa
1cff0 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20  bled\n"));.     
1d000 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1d010 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20  ddVirtualOne(.  
1d020 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65 72          pBuilder
1d030 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72  , mPrereq, mPrer
1d040 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  eq, 0, p, mNoOmi
1d050 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  t, &bIn);.      
1d060 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65  if( bIn==0 ) see
1d070 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20  nZeroNoIN = 1;. 
1d080 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1d090 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  the calls to xBe
1d0a0 73 74 49 6e 64 65 78 28 29 20 68 61 76 65 20 73  stIndex() have s
1d0b0 6f 20 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20  o far failed to 
1d0c0 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20  find a plan.    
1d0d0 2a 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ** that requires
1d0e0 20 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65   no source table
1d0f0 73 20 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65  s at all and doe
1d100 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28  s not use an IN(
1d110 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72  ...).    ** oper
1d120 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e  ator, make a fin
1d130 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69  al call to obtai
1d140 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a  n one here.  */.
1d150 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d160 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72  TE_OK && seenZer
1d170 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20  oNoIN==0 ){.    
1d180 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1d190 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1d1a0 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20  e: all disabled 
1d1b0 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b  and w/o IN\n"));
1d1c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1d1d0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1d1e0 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1d1f0 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1d200 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c   mPrereq, WO_IN,
1d210 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1d220 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
1d230 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72   if( p->needToFr
1d240 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74  eeIdxStr ) sqlit
1d250 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74  e3_free(p->idxSt
1d260 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
1d270 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1d280 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d290 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1d2a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d2b0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
1d2c0 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
1d2d0 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
1d2e0 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
1d2f0 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
1d300 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
1d310 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
1d320 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1d330 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68  eLoopAddOr(.  Wh
1d340 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1d350 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74  pBuilder, .  Bit
1d360 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20  mask mPrereq, . 
1d370 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1d380 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  le.){.  WhereInf
1d390 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
1d3a0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1d3b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1d3c0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1d3d0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
1d3e0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
1d3f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1d400 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
1d410 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
1d420 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
1d430 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
1d440 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
1d450 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
1d460 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d470 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1d480 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
1d490 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e  er->pWC;.  pWCEn
1d4a0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
1d4b0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
1d4c0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1d4d0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
1d4e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
1d4f0 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
1d500 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1d510 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
1d520 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
1d530 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
1d540 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
1d550 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
1d560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
1d570 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
1d580 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1d590 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
1d5a0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
1d5b0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
1d5c0 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
1d5d0 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
1d5e0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
1d5f0 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
1d600 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1d610 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
1d620 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
1d630 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
1d640 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
1d650 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
1d660 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
1d670 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1d680 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
1d690 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
1d6a0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
1d6b0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
1d6c0 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
1d6d0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1d6e0 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
1d6f0 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ;..      WHERETR
1d700 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67  ACE(0x200, ("Beg
1d710 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  in processing OR
1d720 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1d730 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f  Term));.      fo
1d740 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
1d750 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
1d760 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
1d770 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
1d780 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
1d790 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
1d7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
1d7b0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
1d7c0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
1d7d0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
1d7e0 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
1d7f0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1d800 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
1d810 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
1d820 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
1d830 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
1d840 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
1d850 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
1d860 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
1d870 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
1d880 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
1d890 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
1d8a0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
1d8b0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
1d8c0 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
1d8d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1d8e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d8f0 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
1d900 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48  n = 0;.#ifdef WH
1d910 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1d920 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
1d930 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d  ACE(0x200, ("OR-
1d940 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61  term %d of %p ha
1d950 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e  s %d subterms:\n
1d960 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
1d970 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72         (int)(pOr
1d980 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20  Term-pOrWC->a), 
1d990 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64  pTerm, sSubBuild
1d9a0 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20  .pWC->nTerm));. 
1d9b0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1d9c0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
1d9d0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x400 ){.        
1d9e0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
1d9f0 61 75 73 65 50 72 69 6e 74 28 73 53 75 62 42 75  ausePrint(sSubBu
1da00 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20 20 20  ild.pWC);.      
1da10 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
1da20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1da30 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1da40 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1da50 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1da60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1da70 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1da80 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
1da90 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1daa0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ble);.        }e
1dab0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1dac0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
1dad0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1dae0 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
1daf0 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20  , mPrereq);.    
1db00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1db10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1db20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1db30 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1db40 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1db50 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1db60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1db70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1db80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
1db90 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
1dba0 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
1dbb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1dbc0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1dbd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1dbe0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
1dbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
1dc00 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
1dc10 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
1dc20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1dc30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dc40 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74        WhereOrSet
1dc50 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20   sPrev;.        
1dc60 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1dc70 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
1dc80 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1dc90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
1dca0 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
1dcb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1dcc0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
1dcd0 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
1dce0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
1dcf0 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
1dd00 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
1dd10 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
1dd20 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1dd50 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
1dd60 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
1dd70 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1dda0 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
1ddb0 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
1ddc0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
1ddd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1dde0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ddf0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
1de00 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
1de10 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
1de20 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
1de30 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1de40 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
1de50 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1de60 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
1de70 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
1de80 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
1de90 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
1dea0 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
1deb0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1dec0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
1ded0 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
1dee0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
1def0 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b  urrently sSum.a[
1df00 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74  i].rRun is set t
1df10 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
1df20 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a   costs.        *
1df30 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61  * of all sub-sca
1df40 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ns required by t
1df50 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65  he OR-scan. Howe
1df60 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e  ver, due to roun
1df70 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
1df80 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62  errors, it may b
1df90 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  e that the cost 
1dfa0 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69  of the OR-scan i
1dfb0 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20  s equal to its. 
1dfc0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65         ** most e
1dfd0 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61  xpensive sub-sca
1dfe0 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c  n. Add the small
1dff0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e  est possible pen
1e000 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  alty .        **
1e010 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20   (equivalent to 
1e020 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20  multiplying the 
1e030 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f  cost by 1.07) to
1e040 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20   ensure that .  
1e050 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f        ** this do
1e060 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f  es not happen. O
1e070 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48  therwise, for WH
1e080 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68  ERE clauses such
1e090 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
1e0a0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65  ** following whe
1e0b0 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  re there is an i
1e0c0 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20  ndex on "y":.   
1e0d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1e0e0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b  **     WHERE lik
1e0f0 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39  elihood(x=?, 0.9
1e100 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20  9) OR y=?.      
1e110 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1e120 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20  the planner may 
1e130 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f  elect to "OR" to
1e140 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  gether a full-ta
1e150 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a  ble scan and an.
1e160 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
1e170 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68   lookup. And oth
1e180 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64  er similarly odd
1e190 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20   results.  */.  
1e1a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1e1b0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
1e1c0 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n + 1;.        p
1e1d0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
1e1e0 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
1e1f0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1e200 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
1e210 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
1e220 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1e230 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1e240 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e250 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1e260 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73  0, ("End process
1e270 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
1e280 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
1e290 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e2a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1e2b0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1e2c0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
1e2d0 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
1e2e0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1e2f0 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
1e300 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1e310 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1e320 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1e330 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
1e340 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d 20 30  mask mPrereq = 0
1e350 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1e360 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1e370 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1e380 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1e390 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1e3a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e3b0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1e3c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1e3d0 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1e3e0 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1e3f0 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1e400 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1e410 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1e420 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e430 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1e440 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1e450 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1e460 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1e470 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1e480 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1e490 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1e4a0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1e4b0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1e4c0 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1e4d0 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1e4e0 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1e4f0 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1e500 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1e510 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1e520 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1e530 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1e540 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1e550 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1e560 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1e570 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1e580 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1e590 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1e5a0 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1e5b0 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1e5c0 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1e5d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1e5e0 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1e5f0 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1e600 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1e610 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1e620 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1e630 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1e640 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1e650 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d       mPrereq = m
1e660 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
1e670 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1e680 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
1e690 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ype;.#ifndef SQL
1e6a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1e6b0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
1e6c0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
1e6d0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74  Tab) ){.      st
1e6e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e6f0 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  m *p;.      for(
1e700 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70  p=&pItem[1]; p<p
1e710 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
1e720 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65     if( mUnusable
1e730 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74   || (p->fg.joint
1e740 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1e750 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20  T_CROSS)) ){.   
1e760 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65         mUnusable
1e770 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
1e780 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
1e790 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43  >sMaskSet, p->iC
1e7a0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
1e7b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1e7c0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1e7d0 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
1e7e0 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  r, mPrereq, mUnu
1e7f0 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
1e800 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1e810 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e820 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  ABLE */.    {.  
1e830 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1e840 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
1e850 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  der, mPrereq);. 
1e860 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1e870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e880 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1e890 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
1e8a0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1e8b0 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1e8c0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1e8d0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1e8e0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1e8f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1e900 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1e910 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1e920 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1e930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1e940 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1e950 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1e960 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1e970 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35  ereLoop of the 5
1e980 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1e990 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1e9a0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1e9b0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1e9c0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1e9d0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1e9e0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1e9f0 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1ea00 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1ea10 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1ea20 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1ea30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1ea40 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1ea50 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1ea60 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1ea70 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1ea80 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1ea90 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1eaa0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1eab0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1eac0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1ead0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1eae0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1eaf0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1eb00 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1eb10 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1eb20 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1eb30 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1eb40 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1eb50 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1eb60 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1eb70 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1eb80 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1eb90 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1eba0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1ebb0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1ebc0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1ebd0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1ebe0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1ebf0 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1ec00 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1ec10 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1ec20 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1ec30 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1ec40 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1ec50 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1ec60 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1ec70 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1ec80 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1ec90 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1eca0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1ecb0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1ecc0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1ecd0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1ece0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1ecf0 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1ed00 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1ed10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ed20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1ed30 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1ed40 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1ed50 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1ed60 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1ed70 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1ed80 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1ed90 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1eda0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1edb0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1edc0 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  * WHERE_GROUPBY 
1edd0 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f  or _DISTINCTBY o
1ede0 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  r _ORDERBY_LIMIT
1edf0 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ee10 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1ee20 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
1ee30 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
1ee40 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
1ee50 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
1ee60 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
1ee70 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
1ee80 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
1ee90 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
1eea0 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
1eeb0 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
1eec0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1eed0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
1eee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1eef0 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
1ef00 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
1ef10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ef20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
1ef30 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1ef40 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
1ef50 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
1ef60 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
1ef70 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
1ef80 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
1ef90 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
1efa0 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
1efb0 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
1efc0 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
1efd0 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
1efe0 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
1eff0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
1f000 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
1f010 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
1f020 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
1f030 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1f040 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f  use */.  u16 eqO
1f050 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f  pMask;         /
1f060 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69  * Allowed equali
1f070 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1f080 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
1f090 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f0a0 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
1f0b0 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
1f0c0 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
1f0d0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1f0e0 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
1f0f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1f100 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
1f110 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1f120 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
1f130 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1f140 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1f150 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
1f160 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
1f170 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
1f180 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
1f190 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f1b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1f1c0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1f1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f1e0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
1f1f0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1f200 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1f210 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
1f220 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
1f230 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
1f240 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f250 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
1f260 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1f270 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
1f280 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1f290 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
1f2a0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1f2b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1f2c0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
1f2d0 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
1f2e0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
1f2f0 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
1f300 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
1f310 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1f320 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
1f330 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
1f340 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
1f350 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
1f360 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
1f370 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
1f380 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
1f390 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1f3a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1f3b0 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
1f3c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1f3d0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
1f3e0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
1f3f0 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
1f400 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
1f410 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
1f420 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
1f430 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
1f440 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
1f450 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
1f460 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
1f470 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
1f480 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
1f490 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
1f4a0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
1f4b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
1f4c0 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
1f4d0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
1f4e0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
1f4f0 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
1f500 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
1f510 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
1f520 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
1f530 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
1f540 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
1f550 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1f560 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
1f570 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
1f580 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
1f590 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
1f5a0 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
1f5b0 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
1f5c0 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
1f5d0 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
1f5e0 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
1f5f0 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
1f600 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
1f610 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
1f620 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
1f630 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
1f640 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
1f650 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
1f660 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
1f670 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
1f680 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
1f690 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
1f6a0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
1f6b0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1f6c0 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
1f6d0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
1f6e0 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
1f6f0 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
1f700 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
1f710 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
1f720 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
1f730 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
1f740 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
1f750 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1f760 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
1f770 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1f780 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
1f790 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
1f7a0 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
1f7b0 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
1f7c0 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
1f7d0 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
1f7e0 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
1f7f0 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
1f800 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
1f810 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
1f820 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
1f830 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1f840 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
1f850 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
1f860 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
1f870 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
1f880 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
1f890 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
1f8a0 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
1f8b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1f8c0 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
1f8d0 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
1f8e0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
1f8f0 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
1f900 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
1f910 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
1f920 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
1f930 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
1f940 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
1f950 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
1f960 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
1f970 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
1f980 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
1f990 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
1f9a0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1f9b0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
1f9c0 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
1f9d0 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
1f9e0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
1f9f0 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
1fa00 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
1fa10 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
1fa20 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
1fa30 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
1fa40 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
1fa50 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
1fa60 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
1fa70 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
1fa80 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
1fa90 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
1faa0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
1fab0 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
1fac0 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f  .  eqOpMask = WO
1fad0 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f  _EQ | WO_IS | WO
1fae0 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77  _ISNULL;.  if( w
1faf0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1fb00 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
1fb10 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f  ) eqOpMask |= WO
1fb20 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  _IN;.  for(iLoop
1fb30 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
1fb40 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
1fb50 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
1fb60 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
1fb70 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
1fb80 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
1fb90 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1fba0 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29  f( iLoop<nLoop )
1fbb0 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  {.      pLoop = 
1fbc0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pPath->aLoop[iLo
1fbd0 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77  op];.      if( w
1fbe0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1fbf0 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
1fc00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1fc10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f  }else{.      pLo
1fc20 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  op = pLast;.    
1fc30 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
1fc40 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1fc50 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
1fc60 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
1fc70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
1fc80 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44  ed ) obSat = obD
1fc90 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  one;.      break
1fca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72  ;.    }.    iCur
1fcb0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1fcc0 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
1fcd0 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
1fce0 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
1fcf0 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
1fd00 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
1fd10 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
1fd20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
1fd30 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
1fd40 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
1fd50 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
1fd60 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
1fd70 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
1fd80 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
1fd90 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
1fda0 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
1fdb0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
1fdc0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
1fdd0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
1fde0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1fdf0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1fe00 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
1fe10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1fe20 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
1fe30 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
1fe40 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
1fe50 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
1fe60 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fe70 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
1fe80 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
1fe90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1fea0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
1feb0 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49  ereFindTerm(&pWI
1fec0 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20  nfo->sWC, iCur, 
1fed0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
1fee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fef0 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c           ~ready,
1ff00 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20   eqOpMask, 0);. 
1ff10 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1ff20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1ff30 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1ff40 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
1ff50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  ){.        /* IN
1ff60 20 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20   terms are only 
1ff70 76 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e  valid for sortin
1ff80 67 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  g in the ORDER B
1ff90 59 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20  Y LIMIT .       
1ffa0 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
1ffb0 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20  , and then only 
1ffc0 69 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75  if they are actu
1ffd0 61 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20  ally used.      
1ffe0 20 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72    ** by the quer
1fff0 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20  y plan */.      
20000 20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46    assert( wctrlF
20010 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
20020 45 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  ERBY_LIMIT );.  
20030 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
20040 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26  <pLoop->nLTerm &
20050 26 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e  & pTerm!=pLoop->
20060 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b  aLTerm[j]; j++){
20070 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e  }.        if( j>
20080 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29  =pLoop->nLTerm )
20090 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
200a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54   }.      if( (pT
200b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
200c0 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
200d0 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
200e0 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
200f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
20100 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
20110 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
20120 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
20130 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
20140 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
20150 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
20160 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
20170 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
20180 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
20190 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
201a0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
201b0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
201c0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
201d0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
201e0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
201f0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
20200 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
20210 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
20220 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
20230 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
20240 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
20250 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ue;.        test
20260 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
20270 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
20280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
20290 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
202a0 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
202b0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
202c0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
202d0 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
202e0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
202f0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
20300 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
20310 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65  = 0;.        nKe
20320 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
20330 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20    nColumn = 1;. 
20340 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
20350 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
20360 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
20370 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
20380 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
20390 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
203a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
203b0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e     nKeyCol = pIn
203c0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  dex->nKeyCol;.  
203d0 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
203e0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
203f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20400 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f   nColumn==nKeyCo
20410 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  l+1 || !HasRowid
20420 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
20430 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
20440 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  rt( pIndex->aiCo
20450 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d  lumn[nColumn-1]=
20460 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20  =XN_ROWID.      
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
20490 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
204a0 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
204b0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55  erDistinct = IsU
204c0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
204d0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
204e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
204f0 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
20500 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
20510 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
20520 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
20530 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
20540 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
20550 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20560 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
20570 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63  0;.      distinc
20580 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20  tColumns = 0;.  
20590 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
205a0 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
205b0 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 20 3d        u8 bOnce =
205c0 20 31 3b 20 2f 2a 20 54 72 75 65 20 74 6f 20 72   1; /* True to r
205d0 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
205e0 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
205f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20600 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  j>=pLoop->u.btre
20610 65 2e 6e 45 71 20 0a 20 20 20 20 20 20 20 20 20  e.nEq .         
20620 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c     || (pLoop->aL
20630 54 65 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c  Term[j]==0)==(j<
20640 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20  pLoop->nSkip).  
20650 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
20660 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
20670 62 74 72 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d  btree.nEq && j>=
20680 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a  pLoop->nSkip ){.
20690 20 20 20 20 20 20 20 20 20 20 75 31 36 20 65 4f            u16 eO
206a0 70 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  p = pLoop->aLTer
206b0 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  m[j]->eOperator;
206c0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ..          /* S
206d0 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20  kip over == and 
206e0 49 53 20 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65  IS and ISNULL te
206f0 72 6d 73 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70  rms.  (Also skip
20700 20 49 4e 20 74 65 72 6d 73 20 77 68 65 6e 0a 20   IN terms when. 
20710 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e           ** doin
20720 67 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  g WHERE_ORDERBY_
20730 4c 49 4d 49 54 20 70 72 6f 63 65 73 73 69 6e 67  LIMIT processing
20740 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ). .          **
20750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
20760 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
20770 6d 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  m is a column of
20780 20 61 6e 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53   an ((?,?) IN (S
20790 45 4c 45 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20  ELECT...)) .    
207a0 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
207b0 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20 74 68  ion for which th
207c0 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
207d0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
207e0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
207f0 20 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69   ** check that i
20800 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f  t is the only co
20810 6c 75 6d 6e 20 75 73 65 64 20 62 79 20 74 68 69  lumn used by thi
20820 73 20 6c 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73  s loop. Otherwis
20830 65 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e,.          ** 
20840 69 66 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  if it is one of 
20850 74 77 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e  two or more, non
20860 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  e of the columns
20870 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20   can be.        
20880 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20    ** considered 
20890 74 6f 20 6d 61 74 63 68 20 61 6e 20 4f 52 44 45  to match an ORDE
208a0 52 20 42 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20  R BY term.  */. 
208b0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f           if( (eO
208c0 70 20 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30  p & eqOpMask)!=0
208d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
208e0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
208f0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
20900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
20910 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
20920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20930 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
20940 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
20950 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
20960 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20  ontinue;  .     
20970 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
20980 4c 57 41 59 53 28 65 4f 70 20 26 20 57 4f 5f 49  LWAYS(eOp & WO_I
20990 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
209a0 20 20 2f 2a 20 41 4c 57 41 59 53 28 29 20 6a 75    /* ALWAYS() ju
209b0 73 74 69 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70  stification: eOp
209c0 20 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20   is an equality 
209d0 6f 70 65 72 61 74 6f 72 20 64 75 65 20 74 6f 20  operator due to 
209e0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
209f0 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ** j<pLoop->u.bt
20a00 72 65 65 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69  ree.nEq constrai
20a10 6e 74 20 61 62 6f 76 65 2e 20 20 41 6e 79 20 65  nt above.  Any e
20a20 71 75 61 6c 69 74 79 20 6f 74 68 65 72 0a 20 20  quality other.  
20a30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
20a40 6e 20 57 4f 5f 49 4e 20 69 73 20 63 61 70 74 75  n WO_IN is captu
20a50 72 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  red by the previ
20a60 6f 75 73 20 22 69 66 22 2e 20 20 53 6f 20 74 68  ous "if".  So th
20a70 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20  is one.         
20a80 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 68 61 73     ** always has
20a90 20 74 6f 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f   to be WO_IN. */
20aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
20ab0 72 20 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61  r *pX = pLoop->a
20ac0 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b  LTerm[j]->pExpr;
20ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
20ae0 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d  (i=j+1; i<pLoop-
20af0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b  >u.btree.nEq; i+
20b00 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
20b10 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54    if( pLoop->aLT
20b20 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70  erm[i]->pExpr==p
20b30 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  X ){.           
20b40 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
20b50 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  oop->aLTerm[i]->
20b60 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
20b70 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  N) );.          
20b80 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b        bOnce = 0;
20b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
20bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20bd0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
20be0 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20       /* Get the 
20bf0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e  column number in
20c00 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c   the table (iCol
20c10 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72  umn) and sort or
20c20 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  der.        ** (
20c30 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20  revIdx) for the 
20c40 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  j-th column of t
20c50 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
20c60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
20c70 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20   pIndex ){.     
20c80 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
20c90 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
20ca0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  j];.          re
20cb0 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61  vIdx = pIndex->a
20cc0 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
20cd0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
20ce0 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61  umn==pIndex->pTa
20cf0 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
20d00 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
20d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20d20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e      iColumn = XN
20d30 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20  _ROWID;.        
20d40 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20    revIdx = 0;.  
20d50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
20d60 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61   /* An unconstra
20d70 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ined column that
20d80 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d   might be NULL m
20d90 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20  eans that this. 
20da0 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c         ** WhereL
20db0 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d  oop is not well-
20dc0 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  ordered.        
20dd0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
20de0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20  sOrderDistinct. 
20df0 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75          && iColu
20e00 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26  mn>=0.         &
20e10 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  & j>=pLoop->u.bt
20e20 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20  ree.nEq.        
20e30 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62   && pIndex->pTab
20e40 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
20e50 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20  ].notNull==0.   
20e60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
20e70 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
20e80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
20e90 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ..        /* Fin
20ea0 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  d the ORDER BY t
20eb0 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70  erm that corresp
20ec0 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68  onds to the j-th
20ed0 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
20ee0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
20ef0 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52  and mark that OR
20f00 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20  DER BY term off 
20f10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
20f20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b      isMatch = 0;
20f30 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
20f40 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72  ; bOnce && i<nOr
20f50 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
20f60 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42         if( MASKB
20f70 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
20f80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20f90 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
20fa0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
20fb0 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
20fc0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
20fd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20fe0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
20ff0 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
21000 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
21010 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
21020 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
21030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21040 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28   (wctrlFlags & (
21050 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48  WHERE_GROUPBY|WH
21060 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29  ERE_DISTINCTBY))
21070 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b  ==0 ) bOnce = 0;
21080 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21090 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a  Column>=(-1) ){.
210a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
210b0 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
210c0 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
210d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
210e0 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
210f0 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
21100 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
21110 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43   if( pOBExpr->iC
21120 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
21130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21150 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
21160 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21170 4f 42 45 78 70 72 2c 70 49 6e 64 65 78 2d 3e 61  OBExpr,pIndex->a
21180 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45  ColExpr->a[j].pE
21190 78 70 72 2c 69 43 75 72 29 20 29 7b 0a 20 20 20  xpr,iCur) ){.   
211a0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
211b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
211c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
211d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
211e0 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
211f0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
21200 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
21210 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  q(pWInfo->pParse
21220 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
21230 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
21240 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
21250 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
21260 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
21270 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21280 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
21290 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a  Name, pIndex->az
212a0 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f  Coll[j])!=0 ) co
212b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
212c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73    }.          is
212d0 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  Match = 1;.     
212e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
212f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21300 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63  ( isMatch && (wc
21310 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21320 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a  _GROUPBY)==0 ){.
21330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
21340 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20  e sure the sort 
21350 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69  order is compati
21360 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ble in an ORDER 
21370 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
21380 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64       ** Sort ord
21390 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  er is irrelevant
213a0 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20   for a GROUP BY 
213b0 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20  clause. */.     
213c0 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20       if( revSet 
213d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
213e0 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78  f( (rev ^ revIdx
213f0 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  )!=pOrderBy->a[i
21400 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73  ].sortOrder ) is
21410 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
21420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21430 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65          rev = re
21440 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d  vIdx ^ pOrderBy-
21450 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
21460 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21470 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b   rev ) *pRevMask
21480 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f   |= MASKBIT(iLoo
21490 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
214a0 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  revSet = 1;.    
214b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
214c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
214d0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
214e0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30     if( iColumn<0
214f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21500 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69 6e  testcase( distin
21510 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a  ctColumns==0 );.
21520 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
21530 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b  inctColumns = 1;
21540 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21550 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20         obSat |= 
21560 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20  MASKBIT(i);.    
21570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21580 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68       /* No match
21590 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
215a0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20      if( j==0 || 
215b0 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  j<nKeyCol ){.   
215c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
215d0 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
215e0 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
215f0 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
21600 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
21610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21620 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
21630 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20  .      } /* end 
21640 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
21650 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  dex columns */. 
21660 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e 63       if( distinc
21670 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20  tColumns ){.    
21680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
21690 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30  OrderDistinct==0
216a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72   );.        isOr
216b0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b  derDistinct = 1;
216c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
216d0 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65  * end-if not one
216e0 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  -row */..    /* 
216f0 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68  Mark off any oth
21700 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  er ORDER BY term
21710 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
21720 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66   pLoop */.    if
21730 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
21740 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  t ){.      order
21750 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20  DistinctMask |= 
21760 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  pLoop->maskSelf;
21770 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21780 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
21790 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
217a0 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  p;.        Bitma
217b0 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20  sk mTerm;.      
217c0 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29    if( MASKBIT(i)
217d0 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69   & obSat ) conti
217e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  nue;.        p =
217f0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21800 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d  pExpr;.        m
21810 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
21820 65 72 65 45 78 70 72 55 73 61 67 65 28 26 70 57  ereExprUsage(&pW
21830 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70  Info->sMaskSet,p
21840 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
21850 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69  Term==0 && !sqli
21860 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
21870 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t(p) ) continue;
21880 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54  .        if( (mT
21890 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e  erm&~orderDistin
218a0 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  ctMask)==0 ){.  
218b0 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
218c0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
218d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
218e0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20     }.  } /* End 
218f0 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
21900 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f  l WhereLoops fro
21910 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77  m outer-most dow
21920 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20  n to inner-most 
21930 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d  */.  if( obSat==
21940 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20  obDone ) return 
21950 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20  (i8)nOrderBy;.  
21960 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74  if( !isOrderDist
21970 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  inct ){.    for(
21980 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e  i=nOrderBy-1; i>
21990 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42  0; i--){.      B
219a0 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42  itmask m = MASKB
219b0 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20  IT(i) - 1;.     
219c0 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d   if( (obSat&m)==
219d0 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  m ) return i;.  
219e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
219f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
21a00 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  1;.}.../*.** If 
21a10 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
21a20 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
21a30 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64   the mask passed
21a40 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
21a50 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20  Begin(),.** the 
21a60 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20  planner assumes 
21a70 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69  that the specifi
21a80 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74  ed pOrderBy list
21a90 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47   is actually a G
21aa0 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73  ROUP.** BY claus
21ab0 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f  e - and so any o
21ac0 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73  rder that groups
21ad0 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65   rows as require
21ae0 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a  d satisfies the.
21af0 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a  ** request..**.*
21b00 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74  * Normally, in t
21b10 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
21b20 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
21b30 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65  the caller to de
21b40 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
21b50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f  er or not the ro
21b60 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65  ws are really be
21b70 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e  ing delivered in
21b80 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f   sorted order, o
21b90 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d  r.** just in som
21ba0 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68  e other order th
21bb0 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  at provides the 
21bc0 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e  required groupin
21bd0 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  g. However,.** i
21be0 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54  f the WHERE_SORT
21bf0 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20  BYGROUP flag is 
21c00 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73  also passed to s
21c10 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
21c20 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  (), then.** this
21c30 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
21c40 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72   called on the r
21c50 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66  eturned WhereInf
21c60 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74  o object. It ret
21c70 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20  urns.** true if 
21c80 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20  the rows really 
21c90 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69  will be sorted i
21ca0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
21cb0 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a  order, or false.
21cc0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ** otherwise..**
21cd0 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
21ce0 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a   assuming:.**.**
21cf0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
21d00 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a  i1 ON t1(x, Y);.
21d10 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a  **.** then.**.**
21d20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
21d30 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79   t1 GROUP BY x,y
21d40 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20   ORDER BY x,y;  
21d50 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
21d60 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  1.**   SELECT * 
21d70 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
21d80 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c   y,x ORDER BY y,
21d90 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64  x;   -- IsSorted
21da0 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ()==0.*/.int sql
21db0 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65  ite3WhereIsSorte
21dc0 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
21dd0 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nfo){.  assert( 
21de0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
21df0 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
21e00 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  BY );.  assert( 
21e10 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
21e20 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
21e30 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75  YGROUP );.  retu
21e40 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65  rn pWInfo->sorte
21e50 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  d;.}..#ifdef WHE
21e60 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
21e70 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67  /* For debugging
21e80 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74   use only: */.st
21e90 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
21ea0 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57  *wherePathName(W
21eb0 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
21ec0 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72   int nLoop, Wher
21ed0 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20  eLoop *pLast){. 
21ee0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61   static char zNa
21ef0 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b  me[65];.  int i;
21f00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c  .  for(i=0; i<nL
21f10 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65  oop; i++){ zName
21f20 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f  [i] = pPath->aLo
21f30 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20  op[i]->cId; }.  
21f40 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d  if( pLast ) zNam
21f50 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e  e[i++] = pLast->
21f60 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20  cId;.  zName[i] 
21f70 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  = 0;.  return zN
21f80 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
21f90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21fa0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
21fb0 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d  nRow rows, assum
21fc0 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79  ing that the key
21fd0 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65  s have .** nOrde
21fe0 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  rby columns and 
21ff0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e  that the first n
22000 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61  Sorted columns a
22010 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a  re already in.**
22020 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
22030 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f  c LogEst whereSo
22040 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65  rtingCost(.  Whe
22050 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a  reInfo *pWInfo,.
22060 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20    LogEst nRow,. 
22070 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20   int nOrderBy,. 
22080 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a   int nSorted.){.
22090 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74    /* TUNING: Est
220a0 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61  imated cost of a
220b0 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73   full external s
220c0 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ort, where N is 
220d0 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
220e0 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74   of rows to sort
220f0 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
22100 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e   cost = (3.0 * N
22110 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a   * log(N))..  **
22120 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68   .  ** Or, if th
22130 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73  e order-by claus
22140 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75  e has X terms bu
22150 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20  t only the last 
22160 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72  Y .  ** terms ar
22170 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20  e out of order, 
22180 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69  then block-sorti
22190 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74  ng will reduce t
221a0 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67  he .  ** sorting
221b0 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20   cost to:.  **. 
221c0 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
221d0 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20  0 * N * log(N)) 
221e0 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a  * (Y/X).  **.  *
221f0 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d  * The (Y/X) term
22200 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
22210 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69  using stack vari
22220 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a  able rScale.  **
22230 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f   below.  */.  Lo
22240 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f  gEst rScale, rSo
22250 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74  rtCost;.  assert
22260 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20  ( nOrderBy>0 && 
22270 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
22280 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61  t(100) );.  rSca
22290 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  le = sqlite3LogE
222a0 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f  st((nOrderBy-nSo
222b0 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72  rted)*100/nOrder
222c0 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72  By) - 66;.  rSor
222d0 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72  tCost = nRow + r
222e0 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f  Scale + 16;..  /
222f0 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f  * Multiple by lo
22300 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69 73 20  g(M) where M is 
22310 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
22320 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20  tput rows..  ** 
22330 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20 66 6f  Use the LIMIT fo
22340 72 20 4d 20 69 66 20 69 74 20 69 73 20 73 6d 61  r M if it is sma
22350 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70  ller */.  if( (p
22360 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
22370 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  s & WHERE_USE_LI
22380 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49 6e 66  MIT)!=0 && pWInf
22390 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29  o->iLimit<nRow )
223a0 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70 57 49  {.    nRow = pWI
223b0 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d  nfo->iLimit;.  }
223c0 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20  .  rSortCost += 
223d0 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20  estLog(nRow);.  
223e0 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74  return rSortCost
223f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
22400 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65   the list of Whe
22410 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61  reLoop objects a
22420 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  t pWInfo->pLoops
22430 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
22440 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  * attempts to fi
22450 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  nd the lowest co
22460 73 74 20 70 61 74 68 20 74 68 61 74 20 76 69 73  st path that vis
22470 69 74 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f  its each WhereLo
22480 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69  op.** once.  Thi
22490 73 20 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c  s path is then l
224a0 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70  oaded into the p
224b0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f  WInfo->a[].pWLoo
224c0 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  p fields..**.** 
224d0 41 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  Assume that the 
224e0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
224f0 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68 61 74  output rows that
22500 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
22510 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20   sorted.** will 
22520 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74  be nRowEst (in t
22530 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65  he 10*log2 repre
22540 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c  sentation).  Or,
22550 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a   ignore sorting.
22560 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77  ** costs if nRow
22570 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65  Est==0..**.** Re
22580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22590 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c  n success or SQL
225a0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d  ITE_NOMEM of a m
225b0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
225c0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
225d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
225e0 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28  wherePathSolver(
225f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
22600 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73  o, LogEst nRowEs
22610 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69  t){.  int mxChoi
22620 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
22630 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
22640 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
22650 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20  s paths tracked 
22660 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20  */.  int nLoop; 
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22680 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
22690 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s in the join */
226a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
226b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
226c0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
226d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
226e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
226f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
22700 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
22710 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
22720 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22730 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68   counter over th
22740 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a  e terms of the j
22750 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c  oin */.  int ii,
22760 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20   jj;            
22770 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22780 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49  ers */.  int mxI
22790 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
227a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
227b0 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70  ext entry to rep
227c0 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  lace */.  int nO
227d0 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
227e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
227f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22800 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45   terms */.  LogE
22810 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20  st mxCost = 0;  
22820 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
22830 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
22840 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67  f paths */.  Log
22850 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d  Est mxUnsorted =
22860 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75   0;    /* Maximu
22870 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20  m unsorted cost 
22880 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
22890 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e   */.  int nTo, n
228a0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
228b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
228c0 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  id entries in aT
228d0 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20  o[] and aFrom[] 
228e0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
228f0 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  aFrom;         /
22900 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68  * All nFrom path
22910 73 20 61 74 20 74 68 65 20 70 72 65 76 69 6f 75  s at the previou
22920 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  s level */.  Whe
22930 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20  rePath *aTo;    
22940 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54         /* The nT
22950 6f 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  o best paths at 
22960 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65  the current leve
22970 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
22980 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *pFrom;        
22990 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
229a0 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77  f aFrom[] that w
229b0 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
229c0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
229d0 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20  *pTo;           
229e0 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  /* An element of
229f0 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61   aTo[] that we a
22a00 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
22a10 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57  .  WhereLoop *pW
22a20 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
22a30 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  One of the Where
22a40 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
22a50 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58    WhereLoop **pX
22a60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
22a70 73 65 64 20 74 6f 20 64 69 76 79 20 75 70 20 74  sed to divy up t
22a80 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79  he pSpace memory
22a90 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53   */.  LogEst *aS
22aa0 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20  ortCost = 0;    
22ab0 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70  /* Sorting and p
22ac0 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63  artial sorting c
22ad0 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  osts */.  char *
22ae0 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
22af0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
22b00 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
22b10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
22b20 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20    int nSpace;   
22b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
22b40 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
22b50 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70 61 63  located at pSpac
22b60 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  e */..  pParse =
22b70 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
22b80 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
22b90 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57  db;.  nLoop = pW
22ba0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  Info->nLevel;.  
22bb0 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73  /* TUNING: For s
22bc0 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f  imple queries, o
22bd0 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70 61 74  nly the best pat
22be0 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20  h is tracked..  
22bf0 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69  ** For 2-way joi
22c00 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74 20 70  ns, the 5 best p
22c10 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65  aths are followe
22c20 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e  d..  ** For join
22c30 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74  s of 3 or more t
22c40 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65  ables, track the
22c50 20 31 30 20 62 65 73 74 20 70 61 74 68 73 20 2a   10 best paths *
22c60 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28  /.  mxChoice = (
22c70 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20  nLoop<=1) ? 1 : 
22c80 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20  (nLoop==2 ? 5 : 
22c90 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  10);.  assert( n
22ca0 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54  Loop<=pWInfo->pT
22cb0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
22cc0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
22cd0 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e  02, ("---- begin
22ce0 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45   solver.  (nRowE
22cf0 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45  st=%d)\n", nRowE
22d00 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  st));..  /* If n
22d10 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61  RowEst is zero a
22d20 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  nd there is an O
22d30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
22d40 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68  ignore it. In th
22d50 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65  is.  ** case the
22d60 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73   purpose of this
22d70 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69   call is to esti
22d80 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
22d90 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64  of rows returned
22da0 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65  .  ** by the ove
22db0 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65  rall query. Once
22dc0 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 20 68   this estimate h
22dd0 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
22de0 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a  , the caller.  *
22df0 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  * will invoke th
22e00 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65  is function a se
22e10 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69  cond time, passi
22e20 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  ng the estimate 
22e30 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77  as the.  ** nRow
22e40 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20  Est parameter.  
22e50 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
22e60 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
22e70 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20  nRowEst==0 ){.  
22e80 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
22e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72    }else{.    nOr
22ea0 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  derBy = pWInfo->
22eb0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
22ec0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
22ed0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
22ee0 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f  ze space for aTo
22ef0 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72  , aFrom and aSor
22f00 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70  tCost[] */.  nSp
22f10 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68  ace = (sizeof(Wh
22f20 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28  erePath)+sizeof(
22f30 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f  WhereLoop*)*nLoo
22f40 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20  p)*mxChoice*2;. 
22f50 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f   nSpace += sizeo
22f60 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
22f70 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d  erBy;.  pSpace =
22f80 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22f90 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65  RawNN(db, nSpace
22fa0 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d  );.  if( pSpace=
22fb0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
22fc0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
22fd0 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
22fe0 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
22ff0 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
23000 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
23010 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
23020 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
23030 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
23040 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
23050 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
23060 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
23070 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
23080 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
23090 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
230a0 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69  op = pX;.  }.  i
230b0 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
230c0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
230d0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
230e0 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e  ause and it is n
230f0 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64  ot being ignored
23100 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20  , set up.    ** 
23110 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53  space for the aS
23120 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e  ortCost[] array.
23130 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   Each element of
23140 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61   the aSortCost a
23150 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65  rray.    ** is e
23160 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61  ither zero - mea
23170 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20  ning it has not 
23180 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  yet been initial
23190 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20  ized - or the.  
231a0 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72    ** cost of sor
231b0 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77  ting nRowEst row
231c0 73 20 6f 66 20 64 61 74 61 20 77 68 65 72 65 20  s of data where 
231d0 74 68 65 20 66 69 72 73 74 20 58 20 74 65 72 6d  the first X term
231e0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
231f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
23200 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f  are already in o
23210 72 64 65 72 2c 20 77 68 65 72 65 20 58 20 69 73  rder, where X is
23220 20 74 68 65 20 61 72 72 61 79 20 0a 20 20 20 20   the array .    
23230 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ** index.  */.  
23240 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c    aSortCost = (L
23250 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d  ogEst*)pX;.    m
23260 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c  emset(aSortCost,
23270 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   0, sizeof(LogEs
23280 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a  t) * nOrderBy);.
23290 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53    }.  assert( aS
232a0 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70  ortCost==0 || &p
232b0 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
232c0 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74  char*)&aSortCost
232d0 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20  [nOrderBy] );.  
232e0 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
232f0 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t!=0 || &pSpace[
23300 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
23310 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64  pX );..  /* Seed
23320 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74 68   the search with
23330 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50   a single WhereP
23340 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ath containing z
23350 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a  ero WhereLoops..
23360 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47    **.  ** TUNING
23370 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  : Do not let the
23380 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61   number of itera
23390 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32  tions go above 2
233a0 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a  8.  If the cost.
233b0 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e    ** of computin
233c0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
233d0 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64  ndex is not paid
233e0 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65   back within the
233f0 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a 20 72   first 28.  ** r
23400 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ows, then do not
23410 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74   use the automat
23420 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  ic index. */.  a
23430 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d  From[0].nRow = M
23440 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  IN(pParse->nQuer
23450 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73 73  yLoop, 48);  ass
23460 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74 65 33  ert( 48==sqlite3
23470 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a 20 20  LogEst(28) );.  
23480 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73  nFrom = 1;.  ass
23490 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  ert( aFrom[0].is
234a0 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20  Ordered==0 );.  
234b0 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a  if( nOrderBy ){.
234c0 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20      /* If nLoop 
234d0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
234e0 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20  ere are no FROM 
234f0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65  terms in the que
23500 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  ry. Since.    **
23510 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   in this case th
23520 65 20 71 75 65 72 79 20 6d 61 79 20 72 65 74 75  e query may retu
23530 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  rn a maximum of 
23540 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73  one row, the res
23550 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ults.    ** are 
23560 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
23570 65 71 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20  equested order. 
23580 53 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  Set isOrdered to
23590 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20   nOrderBy to.   
235a0 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69   ** indicate thi
235b0 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20  s. Or, if nLoop 
235c0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
235d0 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65  zero, set isOrde
235e0 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31  red to.    ** -1
235f0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
23600 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
23610 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
23620 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20  be ordered, .   
23630 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e   ** depending on
23640 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64   the loops added
23650 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
23660 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46  plan.  */.    aF
23670 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64  rom[0].isOrdered
23680 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20   = nLoop>0 ? -1 
23690 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  : nOrderBy;.  }.
236a0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75  .  /* Compute su
236b0 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65  ccessively longe
236c0 72 20 57 68 65 72 65 50 61 74 68 73 20 75 73 69  r WherePaths usi
236d0 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ng the previous 
236e0 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20  generation.  ** 
236f0 6f 66 20 57 68 65 72 65 50 61 74 68 73 20 61 73  of WherePaths as
23700 20 74 68 65 20 62 61 73 69 73 20 66 6f 72 20 74   the basis for t
23710 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74  he next.  Keep t
23720 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68  rack of the mxCh
23730 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70  oice.  ** best p
23740 61 74 68 73 20 61 74 20 65 61 63 68 20 67 65 6e  aths at each gen
23750 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72  eration */.  for
23760 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
23770 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
23780 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20  .    nTo = 0;.  
23790 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f    for(ii=0, pFro
237a0 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f  m=aFrom; ii<nFro
237b0 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  m; ii++, pFrom++
237c0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c  ){.      for(pWL
237d0 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  oop=pWInfo->pLoo
237e0 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f  ps; pWLoop; pWLo
237f0 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74  op=pWLoop->pNext
23800 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c  Loop){.        L
23810 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20  ogEst nOut;     
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23830 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64   /* Rows visited
23840 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f   by (pFrom+pWLoo
23850 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f  p) */.        Lo
23860 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20  gEst rCost;     
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23880 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20  /* Cost of path 
23890 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
238a0 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
238b0 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20   rUnsorted;     
238c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
238d0 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20  nsorted cost of 
238e0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
238f0 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69 73 4f  /.        i8 isO
23900 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e  rdered = pFrom->
23910 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69  isOrdered;  /* i
23920 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28 70 46  sOrdered for (pF
23930 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
23940 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
23950 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20  askNew;         
23960 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
23970 20 6f 66 20 73 72 63 20 76 69 73 69 74 65 64 20   of src visited 
23980 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20  by (..) */.     
23990 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
239a0 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sk = 0;         
239b0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
239c0 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20  rev-order loops 
239d0 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20  for (..) */..   
239e0 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70       if( (pWLoop
239f0 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f  ->prereq & ~pFro
23a00 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
23a10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23a20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
23a30 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f  >maskSelf & pFro
23a40 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20  m->maskLoop)!=0 
23a50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23a60 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
23a70 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23a80 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
23a90 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31  && pFrom->nRow<1
23aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
23ab0 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20  * Do not use an 
23ac0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
23ad0 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f 6f 70  if the this loop
23ae0 20 69 73 20 65 78 70 65 63 74 65 64 0a 20 20 20   is expected.   
23af0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e         ** to run
23b00 20 6c 65 73 73 20 74 68 61 6e 20 32 20 74 69 6d   less than 2 tim
23b10 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
23b20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
23b30 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
23b40 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
23b50 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
23b60 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
23b70 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20  s point, pWLoop 
23b80 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
23b90 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f  o be the next lo
23ba0 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  op. .        ** 
23bb0 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74  Compute its cost
23bc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73   */.        rUns
23bd0 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
23be0 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d  ogEstAdd(pWLoop-
23bf0 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e  >rSetup,pWLoop->
23c00 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52  rRun + pFrom->nR
23c10 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e  ow);.        rUn
23c20 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
23c30 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
23c40 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73  ted, pFrom->rUns
23c50 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  orted);.        
23c60 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  nOut = pFrom->nR
23c70 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75  ow + pWLoop->nOu
23c80 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e  t;.        maskN
23c90 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  ew = pFrom->mask
23ca0 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
23cb0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
23cc0 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30   if( isOrdered<0
23cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
23ce0 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50  Ordered = whereP
23cf0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
23d00 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20  rBy(pWInfo,.    
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
23d30 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e  rBy, pFrom, pWIn
23d40 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a  fo->wctrlFlags,.
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57         iLoop, pW
23d70 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b  Loop, &revMask);
23d80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23d90 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
23da0 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
23db0 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
23dc0 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
23dd0 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65  red>=0 && isOrde
23de0 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a  red<nOrderBy ){.
23df0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53            if( aS
23e00 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
23e10 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d]==0 ){.       
23e20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69       aSortCost[i
23e30 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72  sOrdered] = wher
23e40 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20  eSortingCost(.  
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
23e60 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e  Info, nRowEst, n
23e70 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72  OrderBy, isOrder
23e80 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ed.            )
23e90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23ea0 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
23eb0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
23ec0 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72  (rUnsorted, aSor
23ed0 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
23ee0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48  );..          WH
23ef0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a  ERETRACE(0x002,.
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
23f10 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25  ---- sort cost=%
23f20 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72  -3d (%d/%d) incr
23f30 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74  eases cost %3d t
23f40 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20  o %-3d\n",.     
23f50 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43            aSortC
23f60 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20  ost[isOrdered], 
23f70 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65  (nOrderBy-isOrde
23f80 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20  red), nOrderBy, 
23f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23fa0 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74  rUnsorted, rCost
23fb0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ));.        }els
23fc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f  e{.          rCo
23fd0 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  st = rUnsorted;.
23fe0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23ff0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
24000 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f  ee if pWLoop sho
24010 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20  uld be added to 
24020 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20  the set of.     
24030 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62     ** mxChoice b
24040 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
24050 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
24060 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f       ** First lo
24070 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ok for an existi
24080 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65  ng path among be
24090 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a  st-so-far paths.
240a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
240b0 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20  covers the same 
240c0 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
240d0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73   has the same is
240e0 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  Ordered.        
240f0 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68  ** setting as th
24100 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63  e current path c
24110 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20  andidate..      
24120 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
24130 54 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d  The term "((pTo-
24140 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
24150 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20  ered)&0x80)==0" 
24160 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  is equivalent.  
24170 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f        ** to (pTo
24180 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  ->isOrdered==(-1
24190 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d  ))==(isOrdered==
241a0 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72  (-1))" for the r
241b0 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ange.        ** 
241c0 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20  of legal values 
241d0 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d  for isOrdered, -
241e0 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a  1..64..        *
241f0 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
24200 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
24210 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
24220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
24230 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
24240 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20  maskNew.        
24250 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f     && ((pTo->isO
24260 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
24270 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20  )&0x80)==0.     
24280 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
24290 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a      testcase( jj
242a0 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20  ==nTo-1 );.     
242b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
242c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
242d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
242e0 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20  jj>=nTo ){.     
242f0 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20       /* None of 
24300 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 65 73  the existing bes
24310 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d  t-so-far paths m
24320 61 74 63 68 20 74 68 65 20 63 61 6e 64 69 64 61  atch the candida
24330 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
24340 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
24350 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ce.           &&
24360 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c   (rCost>mxCost |
24370 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74  | (rCost==mxCost
24380 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d   && rUnsorted>=m
24390 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20  xUnsorted)).    
243a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
243b0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
243c0 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69 73  ent candidate is
243d0 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20   no better than 
243e0 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  any of the mxCho
243f0 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ice.            
24400 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e 74  ** paths current
24410 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73  ly in the best-s
24420 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20 53  o-far buffer.  S
24430 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20 20 20  o discard.      
24440 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
24450 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76  ndidate as not v
24460 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66  iable. */.#ifdef
24470 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
24480 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
24490 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
244a0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
244b0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
244c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
244d0 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20  gPrintf("Skip   
244e0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
244f0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24510 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
24520 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
24530 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
24540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24550 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
24560 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
24570 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
24580 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
24590 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
245a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
245b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
245c0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
245d0 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68  ints it means th
245e0 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69  at the new candi
245f0 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20 20  date path.      
24600 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20      ** needs to 
24610 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
24620 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66  set of best-so-f
24630 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20  ar paths. */.   
24640 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
24650 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
24660 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
24670 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
24680 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
24690 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
246a0 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
246b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
246c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
246d0 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
246e0 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
246f0 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
24700 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
24710 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
24720 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mxI;.          }
24730 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d  .          pTo =
24740 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65   &aTo[jj];.#ifde
24750 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
24760 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
24770 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
24780 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
24790 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
247a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
247b0 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
247c0 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
247d0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
247e0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
247f0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
24800 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
24810 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
24830 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
24840 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
24850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
24860 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
24870 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
24880 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
24890 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f   here if best-so
248a0 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54  -far path pTo=aT
248b0 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65  o[jj] covers the
248c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
248d0 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
248e0 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 20  and has the sam 
248f0 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e  isOrdered settin
24900 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  g as the.       
24910 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20     ** candidate 
24920 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20  path.  Check to 
24930 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64 69  see if the candi
24940 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c  date should repl
24950 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ace.          **
24960 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63   pTo or if the c
24970 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20  andidate should 
24980 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20  be skipped */.  
24990 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
249a0 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20  >rCost<rCost || 
249b0 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f  (pTo->rCost==rCo
249c0 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
249d0 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66  =nOut) ){.#ifdef
249e0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
249f0 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
24a00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
24a10 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
24a20 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
24a30 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24a40 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
24a50 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70             "Skip
24a60 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
24a70 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
24aa0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
24ab0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
24ac0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
24ad0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
24ae0 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
24af0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
24b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24b10 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
24b20 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
24b30 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
24b60 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
24b70 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
24b80 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
24b90 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
24ba0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
24bb0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
24bc0 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
24bd0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
24be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
24bf0 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61  card the candida
24c00 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72  te path from fur
24c10 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  ther considerati
24c20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
24c30 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
24c40 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b  >rCost==rCost );
24c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
24c60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
24c70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
24c80 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
24c90 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20  t==rCost+1 );.  
24ca0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
24cb0 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
24cc0 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
24cd0 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20   path is better 
24ce0 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20  than the.       
24cf0 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20     ** pTo path. 
24d00 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74   Replace pTo wit
24d10 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
24d20 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
24d30 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
24d40 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
24d50 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
24d60 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
24d70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24d80 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24da0 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25  Update %s cost=%
24db0 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
24dc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
24dd0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
24de0 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
24df0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
24e00 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
24e10 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
24e20 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
24e30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
24e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24e50 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
24e60 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
24e70 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
24e90 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
24ea0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
24eb0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
24ec0 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
24ed0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
24ee0 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
24ef0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
24f00 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
24f10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
24f20 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f  .        /* pWLo
24f30 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20  op is a winner. 
24f40 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73   Add it to the s
24f50 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61  et of best so fa
24f60 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  r */.        pTo
24f70 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72  ->maskLoop = pFr
24f80 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
24f90 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
24fa0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65  .        pTo->re
24fb0 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b  vLoop = revMask;
24fc0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52  .        pTo->nR
24fd0 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20  ow = nOut;.     
24fe0 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20     pTo->rCost = 
24ff0 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70  rCost;.        p
25000 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20  To->rUnsorted = 
25010 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
25020 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
25030 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20  d = isOrdered;. 
25040 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
25050 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d  o->aLoop, pFrom-
25060 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57  >aLoop, sizeof(W
25070 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70  hereLoop*)*iLoop
25080 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  );.        pTo->
25090 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70  aLoop[iLoop] = p
250a0 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  WLoop;.        i
250b0 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
250c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   ){.          mx
250d0 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  I = 0;.         
250e0 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d   mxCost = aTo[0]
250f0 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
25100 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61    mxUnsorted = a
25110 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20  To[0].nRow;.    
25120 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20        for(jj=1, 
25130 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c  pTo=&aTo[1]; jj<
25140 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20  mxChoice; jj++, 
25150 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
25160 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
25170 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20  st>mxCost .     
25180 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d          || (pTo-
25190 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  >rCost==mxCost &
251a0 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64  & pTo->rUnsorted
251b0 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20  >mxUnsorted) .  
251c0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
251d0 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73             mxCos
251e0 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a  t = pTo->rCost;.
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
25200 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e  Unsorted = pTo->
25210 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
25220 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a           mxI = j
25230 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  j;.            }
25240 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25260 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45     }..#ifdef WHE
25270 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
25280 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69   /* >=2 */.    i
25290 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
252a0 72 61 63 65 20 26 20 30 78 30 32 20 29 7b 0a 20  race & 0x02 ){. 
252b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
252c0 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 61 66  gPrintf("---- af
252d0 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d 2d 2d  ter round %d ---
252e0 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20  -\n", iLoop);.  
252f0 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 54      for(ii=0, pT
25300 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69  o=aTo; ii<nTo; i
25310 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  i++, pTo++){.   
25320 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25330 67 50 72 69 6e 74 66 28 22 20 25 73 20 63 6f 73  gPrintf(" %s cos
25340 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d 33 64  t=%-3d nrow=%-3d
25350 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20   order=%c",.    
25360 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
25370 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
25380 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
25390 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
253a0 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73           pTo->is
253b0 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28 70 54  Ordered>=0 ? (pT
253c0 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
253d0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
253e0 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64    if( pTo->isOrd
253f0 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  ered>0 ){.      
25400 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25410 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30 78 25  Printf(" rev=0x%
25420 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72 65 76  llx\n", pTo->rev
25430 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Loop);.        }
25440 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25450 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25460 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
25470 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25480 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
25490 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65 73 20   Swap the roles 
254a0 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61 54 6f  of aFrom and aTo
254b0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67 65   for the next ge
254c0 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
254d0 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20 20 20  pFrom = aTo;.   
254e0 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a 20 20   aTo = aFrom;.  
254f0 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b    aFrom = pFrom;
25500 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f  .    nFrom = nTo
25510 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 72  ;.  }..  if( nFr
25520 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  om==0 ){.    sql
25530 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25540 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79 20 73  rse, "no query s
25550 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20 20 73  olution");.    s
25560 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25570 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65   pSpace);.    re
25580 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25590 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  R;.  }.  .  /* F
255a0 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  ind the lowest c
255b0 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d  ost path.  pFrom
255c0 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f   will be left po
255d0 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70  inting to that p
255e0 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d  ath */.  pFrom =
255f0 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69   aFrom;.  for(ii
25600 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69  =1; ii<nFrom; ii
25610 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
25620 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b  om->rCost>aFrom[
25630 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f  ii].rCost ) pFro
25640 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a  m = &aFrom[ii];.
25650 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
25660 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c  Info->nLevel==nL
25670 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64  oop );.  /* Load
25680 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
25690 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66   path into pWInf
256a0 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  o */.  for(iLoop
256b0 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
256c0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57   iLoop++){.    W
256d0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
256e0 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20  l = pWInfo->a + 
256f0 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65  iLoop;.    pLeve
25700 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f  l->pWLoop = pWLo
25710 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  op = pFrom->aLoo
25720 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c  p[iLoop];.    pL
25730 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57  evel->iFrom = pW
25740 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20  Loop->iTab;.    
25750 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
25760 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
25770 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
25780 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  rom].iCursor;.  
25790 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  }.  if( (pWInfo-
257a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
257b0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
257c0 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49  T)!=0.   && (pWI
257d0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
257e0 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
257f0 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49  BY)==0.   && pWI
25800 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
25810 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
25820 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73  OOP.   && nRowEs
25830 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  t.  ){.    Bitma
25840 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  sk notUsed;.    
25850 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
25860 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
25870 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
25880 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53 65 74 2c  o->pDistinctSet,
25890 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20   pFrom,.        
258a0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44           WHERE_D
258b0 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70  ISTINCTBY, nLoop
258c0 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
258d0 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55  [nLoop-1], &notU
258e0 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
258f0 3d 3d 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69  ==pWInfo->pDisti
25900 6e 63 74 53 65 74 2d 3e 6e 45 78 70 72 20 29 7b  nctSet->nExpr ){
25910 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
25920 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
25930 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
25940 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  D;.    }.  }.  i
25950 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
25960 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  rBy ){.    if( p
25970 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
25980 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
25990 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20 69 66  CTBY ){.      if
259a0 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  ( pFrom->isOrder
259b0 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  ed==pWInfo->pOrd
259c0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
259d0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65         pWInfo->e
259e0 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
259f0 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
25a00 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
25a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 49 6e  else{.      pWIn
25a20 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 46 72  fo->nOBSat = pFr
25a30 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20  om->isOrdered;. 
25a40 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76       pWInfo->rev
25a50 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65  Mask = pFrom->re
25a60 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  vLoop;.      if(
25a70 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c   pWInfo->nOBSat<
25a80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  =0 ){.        pW
25a90 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 30  Info->nOBSat = 0
25aa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c  ;.        if( nL
25ab0 6f 6f 70 3e 30 20 26 26 20 28 70 46 72 6f 6d 2d  oop>0 && (pFrom-
25ac0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d  >aLoop[nLoop-1]-
25ad0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
25ae0 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
25af0 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
25b00 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   m = 0;.        
25b10 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
25b20 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
25b30 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
25b40 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
25b50 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  From,.          
25b60 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
25b70 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c  E_ORDERBY_LIMIT,
25b80 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
25b90 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
25ba0 20 26 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &m);.          
25bb0 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
25bc0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
25bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
25be0 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49  WInfo->bOrderedI
25bf0 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20  nnerLoop = 1;.  
25c00 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
25c10 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20  ->revMask = m;. 
25c20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25c30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25c40 20 7d 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e   }.    if( (pWIn
25c50 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
25c60 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
25c70 55 50 29 0a 20 20 20 20 20 20 20 20 26 26 20 70  UP).        && p
25c80 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70  WInfo->nOBSat==p
25c90 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
25ca0 3e 6e 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e  >nExpr && nLoop>
25cb0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42  0.    ){.      B
25cc0 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
25cd0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   0;.      int nO
25ce0 72 64 65 72 20 3d 20 77 68 65 72 65 50 61 74 68  rder = wherePath
25cf0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
25d00 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
25d10 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20  >pOrderBy, .    
25d20 20 20 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20        pFrom, 0, 
25d30 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e  nLoop-1, pFrom->
25d40 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20  aLoop[nLoop-1], 
25d50 26 72 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29  &revMask.      )
25d60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25d70 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d  pWInfo->sorted==
25d80 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
25d90 4f 72 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70  Order==pWInfo->p
25da0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
25db0 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
25dc0 2d 3e 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20  ->sorted = 1;.  
25dd0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
25de0 76 4d 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b  vMask = revMask;
25df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25e00 20 7d 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   }...  pWInfo->n
25e10 52 6f 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e  RowOut = pFrom->
25e20 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nRow;..  /* Free
25e30 20 74 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   temporary memor
25e40 79 20 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63  y and return suc
25e50 63 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cess */.  sqlite
25e60 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61  3DbFree(db, pSpa
25e70 63 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ce);.  return SQ
25e80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25e90 2a 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75  * Most queries u
25ea0 73 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  se only a single
25eb0 20 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65   table (they are
25ec0 20 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20   not joins) and 
25ed0 68 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d  have.** simple =
25ee0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67  = constraints ag
25ef0 61 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69  ainst indexed fi
25f00 65 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74  elds.  This rout
25f10 69 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ine attempts.** 
25f20 74 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69  to plan those si
25f30 6d 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67  mple cases using
25f40 20 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d   much less cerem
25f50 6f 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20  ony than the.** 
25f60 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
25f70 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61  query planner, a
25f80 6e 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64  nd thereby yield
25f90 20 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f   faster sqlite3_
25fa0 70 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d  prepare().** tim
25fb0 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  es for the commo
25fc0 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  n case..**.** Re
25fd0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
25fe0 20 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69   success, if thi
25ff0 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68  s query can be h
26000 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a  andled by this.*
26010 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72  * no-frills quer
26020 79 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75  y planner.  Retu
26030 72 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  rn zero if this 
26040 71 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20  query needs the 
26050 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
26060 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
26070 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
26080 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57   whereShortCut(W
26090 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
260a0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
260b0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
260c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
260d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
260e0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
260f0 43 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  C;.  WhereTerm *
26100 70 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f  pTerm;.  WhereLo
26110 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74  op *pLoop;.  int
26120 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a   iCur;.  int j;.
26130 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
26140 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20   Index *pIdx;.. 
26150 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
26160 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
26170 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
26180 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
26190 53 55 42 43 4c 41 55 53 45 20 29 20 72 65 74 75  SUBCLAUSE ) retu
261a0 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
261b0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
261c0 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70  ->nSrc>=1 );.  p
261d0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
261e0 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54  TabList->a;.  pT
261f0 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
26200 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
26210 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
26220 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d   0;.  if( pItem-
26230 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
26240 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
26250 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  ur = pItem->iCur
26260 73 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57  sor;.  pWC = &pW
26270 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f  Info->sWC;.  pLo
26280 6f 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  op = pBuilder->p
26290 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73  New;.  pLoop->ws
262a0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f  Flags = 0;.  pLo
262b0 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  op->nSkip = 0;. 
262c0 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
262d0 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57  WhereFindTerm(pW
262e0 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20  C, iCur, -1, 0, 
262f0 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b  WO_EQ|WO_IS, 0);
26300 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
26310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
26320 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
26330 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c   WO_IS );.    pL
26340 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
26350 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
26360 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f  HERE_IPK|WHERE_O
26370 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70  NEROW;.    pLoop
26380 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
26390 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  erm;.    pLoop->
263a0 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
263b0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
263c0 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54  Eq = 1;.    /* T
263d0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61  UNING: Cost of a
263e0 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73   rowid lookup is
263f0 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70   10 */.    pLoop
26400 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a  ->rRun = 33;  /*
26410 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
26420 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73  st(10) */.  }els
26430 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  e{.    for(pIdx=
26440 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
26450 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
26460 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
26470 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61   opMask;.      a
26480 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c  ssert( pLoop->aL
26490 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70  TermSpace==pLoop
264a0 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20  ->aLTerm );.    
264b0 20 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49    if( !IsUniqueI
264c0 6e 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20  ndex(pIdx).     
264d0 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74    || pIdx->pPart
264e0 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20  IdxWhere!=0 .   
264f0 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65      || pIdx->nKe
26500 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70  yCol>ArraySize(p
26510 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  Loop->aLTermSpac
26520 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74  e) .      ) cont
26530 69 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61  inue;.      opMa
26540 73 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e  sk = pIdx->uniqN
26550 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c  otNull ? (WO_EQ|
26560 57 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a  WO_IS) : WO_EQ;.
26570 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
26580 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
26590 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54  j++){.        pT
265a0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
265b0 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
265c0 69 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61  iCur, j, 0, opMa
265d0 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  sk, pIdx);.     
265e0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
265f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
26600 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
26610 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
26620 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IS );.        p
26630 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20  Loop->aLTerm[j] 
26640 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
26650 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49  .      if( j!=pI
26660 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  dx->nKeyCol ) co
26670 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c  ntinue;.      pL
26680 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  oop->wsFlags = W
26690 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
266a0 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52  HERE_ONEROW|WHER
266b0 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
266c0 20 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76   if( pIdx->isCov
266d0 65 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d  ering || (pItem-
266e0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
266f0 6d 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29  mnsInIndex(pIdx)
26700 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
26710 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
26720 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
26730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26740 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
26750 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  j;.      pLoop->
26760 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b  u.btree.nEq = j;
26770 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
26780 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70  btree.pIndex = p
26790 49 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  Idx;.      /* TU
267a0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
267b0 75 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f  unique index loo
267c0 6b 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20  kup is 15 */.   
267d0 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d     pLoop->rRun =
267e0 20 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c   39;  /* 39==sql
267f0 69 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a  ite3LogEst(15) *
26800 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
26810 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
26820 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b  Loop->wsFlags ){
26830 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  .    pLoop->nOut
26840 20 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20   = (LogEst)1;.  
26850 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
26860 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20  WLoop = pLoop;. 
26870 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65     pLoop->maskSe
26880 6c 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  lf = sqlite3Wher
26890 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f  eGetMask(&pWInfo
268a0 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->sMaskSet, iCur
268b0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  );.    pWInfo->a
268c0 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43  [0].iTabCur = iC
268d0 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ur;.    pWInfo->
268e0 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20  nRowOut = 1;.   
268f0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
26900 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e  derBy ) pWInfo->
26910 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f  nOBSat =  pWInfo
26920 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
26930 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  r;.    if( pWInf
26940 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
26950 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
26960 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49  NCT ){.      pWI
26970 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
26980 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
26990 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69  UNIQUE;.    }.#i
269a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
269b0 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64  G.    pLoop->cId
269c0 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20   = '0';.#endif. 
269d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
269e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
269f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
26a00 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
26a10 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
26a20 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
26a30 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
26a40 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
26a50 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
26a60 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
26a70 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
26a80 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
26a90 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
26aa0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
26ab0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
26ac0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
26ad0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
26ae0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
26af0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
26b00 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
26b10 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
26b20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
26b30 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
26b40 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
26b50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
26b60 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
26b70 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
26b80 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
26b90 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
26ba0 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
26bb0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
26bc0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
26bd0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
26be0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
26bf0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
26c00 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
26c10 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
26c20 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
26c30 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
26c40 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
26c50 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
26c60 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
26c70 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
26c80 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
26c90 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
26ca0 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
26cb0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
26cc0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
26cd0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
26ce0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
26cf0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
26d00 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
26d10 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
26d20 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
26d30 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
26d40 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
26d50 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
26d60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
26d70 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
26d80 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
26d90 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
26da0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
26dc0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
26dd0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
26e00 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
26e10 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
26e40 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
26e50 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
26e60 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
26e70 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
26e80 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
26e90 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
26ea0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
26eb0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
26ec0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
26ed0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
26ee0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
26ef0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
26f00 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
26f10 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
26f20 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
26f30 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
26f40 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
26f50 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
26f60 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
26f70 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
26f80 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
26f90 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
26fa0 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
26fb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
26fc0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
26fd0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
26fe0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
26ff0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
27000 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
27010 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
27020 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
27030 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
27040 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
27050 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
27060 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
27070 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
27080 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
27090 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
270a0 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
270b0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
270c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
270d0 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
270e0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
270f0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
27100 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
27110 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
27120 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
27130 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
27140 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
27150 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
27160 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
27170 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
27180 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
27190 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
271a0 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
271b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
271c0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
271d0 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
271e0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
271f0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
27200 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
27210 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
27220 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
27230 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
27240 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
27250 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
27260 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
27270 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
27280 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
27290 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
272a0 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
272b0 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
272c0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
272d0 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
272e0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
272f0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
27300 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
27310 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
27320 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
27330 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
27340 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
27350 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
27360 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
27370 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
27380 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
27390 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
273a0 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
273b0 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
273c0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
273d0 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
273e0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
273f0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
27400 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
27410 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
27420 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
27430 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
27440 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
27450 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
27460 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
27470 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
27480 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
27490 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
274a0 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
274b0 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
274c0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
274d0 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
274e0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
274f0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
27500 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
27510 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
27520 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
27530 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
27540 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
27550 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
27560 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
27570 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
27580 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
27590 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
275a0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
275b0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
275c0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
275d0 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
275e0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
275f0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
27600 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
27610 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
27620 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
27630 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
27640 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
27650 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
27660 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
27670 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
27680 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
27690 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  (or the GROUP BY
276a0 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68   clause.** if th
276b0 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
276c0 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77  flag is set in w
276d0 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20  ctrlFlags) of a 
276e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
276f0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
27700 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
27710 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
27720 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
27730 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
27740 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
27750 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
27760 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f  atement, then pO
27770 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
27780 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75  **.** The iIdxCu
27790 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  r parameter is t
277a0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
277b0 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49   of an index.  I
277c0 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53  f .** WHERE_OR_S
277d0 55 42 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c  UBCLAUSE is set,
277e0 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20   iIdxCur is the 
277f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
27800 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20   an index.** to 
27810 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73  use for OR claus
27820 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  e processing.  T
27830 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
27840 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a  should use this.
27850 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73  ** specific curs
27860 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e  or.  If WHERE_ON
27870 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73  EPASS_DESIRED is
27880 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43   set, then iIdxC
27890 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  ur is.** the fir
278a0 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20  st cursor in an 
278b0 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73  array of cursors
278c0 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73   for all indices
278d0 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c  .  iIdxCur shoul
278e0 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  d.** be used to 
278f0 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72  compute the appr
27900 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64  opriate cursor d
27910 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63  epending on whic
27920 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73  h index is.** us
27930 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
27940 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
27950 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
27960 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
27970 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
27980 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
27990 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
279a0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
279b0 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  : A list of all 
279c0 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
279d0 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
279e0 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
279f0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
27a00 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
27a10 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
27a20 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
27a30 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  Y (or GROUP BY) 
27a40 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
27a50 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
27a60 44 69 73 74 69 6e 63 74 53 65 74 2c 20 2f 2a 20  DistinctSet, /* 
27a70 54 72 79 20 6e 6f 74 20 74 6f 20 6f 75 74 70 75  Try not to outpu
27a80 74 20 74 77 6f 20 72 6f 77 73 20 74 68 61 74 20  t two rows that 
27a90 64 75 70 6c 69 63 61 74 65 20 74 68 65 73 65 20  duplicate these 
27aa0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
27ab0 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
27ac0 54 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  The WHERE_* flag
27ad0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
27ae0 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e  iteInt.h */.  in
27af0 74 20 69 41 75 78 41 72 67 20 20 20 20 20 20 20  t iAuxArg       
27b00 20 20 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52        /* If WHER
27b10 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69  E_OR_SUBCLAUSE i
27b20 73 20 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72  s set, index cur
27b30 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  sor number.     
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45       ** If WHERE
27b60 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e  _USE_LIMIT, then
27b70 20 74 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e   the limit amoun
27b80 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  t */.){.  int nB
27b90 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
27ba0 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
27bb0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
27bc0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
27bd0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
27be0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
27bf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
27c00 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
27c10 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
27c20 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
27c30 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
27c40 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
27c50 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
27c60 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
27c70 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
27c80 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
27c90 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
27ca0 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
27cb0 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
27cc0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
27cd0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
27ce0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
27cf0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
27d00 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
27d10 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
27d20 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
27d30 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
27d40 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
27d50 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
27d60 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
27d70 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
27d80 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
27d90 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
27da0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
27db0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
27dc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
27dd0 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
27de0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
27df0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
27e00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
27e10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
27e20 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
27e30 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
27e40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
27e50 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e70 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
27e80 0a 20 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65  .  u8 bFordelete
27e90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
27ea0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
27eb0 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70  E or zero, as ap
27ec0 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20  propriate */..  
27ed0 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
27ee0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
27ef0 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30  ASS_MULTIROW)==0
27f00 20 7c 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77   || (.        (w
27f10 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
27f20 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
27f30 44 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28  D)!=0 .     && (
27f40 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27f50 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
27f60 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  ==0 .  ));..  /*
27f70 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45   Only one of WHE
27f80 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20  RE_OR_SUBCLAUSE 
27f90 6f 72 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  or WHERE_USE_LIM
27fa0 49 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  IT */.  assert( 
27fb0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
27fc0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
27fd0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
27fe0 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20   || (wctrlFlags 
27ff0 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
28000 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56  T)==0 );..  /* V
28010 61 72 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69  ariable initiali
28020 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d  zation */.  db =
28030 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d   pParse->db;.  m
28040 65 6d 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20  emset(&sWLB, 0, 
28050 73 69 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a  sizeof(sWLB));..
28060 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52    /* An ORDER/GR
28070 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66  OUP BY clause of
28080 20 6d 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65   more than 63 te
28090 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  rms cannot be op
280a0 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73  timized */.  tes
280b0 74 63 61 73 65 28 20 70 4f 72 64 65 72 42 79 20  tcase( pOrderBy 
280c0 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
280d0 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69  pr==BMS-1 );.  i
280e0 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  f( pOrderBy && p
280f0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d  OrderBy->nExpr>=
28100 42 4d 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d  BMS ) pOrderBy =
28110 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65   0;.  sWLB.pOrde
28120 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
28130 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
28140 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
28150 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
28160 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
28170 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
28180 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
28190 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
281a0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
281b0 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .) */.  if( Opti
281c0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
281d0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74  (db, SQLITE_Dist
281e0 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20  inctOpt) ){.    
281f0 77 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57  wctrlFlags &= ~W
28200 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
28210 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  CT;.  }..  /* Th
28220 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  e number of tabl
28230 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
28240 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
28250 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
28260 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61  f.  ** bits in a
28270 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20   Bitmask .  */. 
28280 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c   testcase( pTabL
28290 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29  ist->nSrc==BMS )
282a0 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  ;.  if( pTabList
282b0 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
282c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
282d0 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
282e0 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
282f0 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
28300 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
28310 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
28320 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65  tion normally ge
28330 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64  nerates a nested
28340 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61   loop for all ta
28350 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54  bles in .  ** pT
28360 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20  abList.  But if 
28370 74 68 65 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  the WHERE_OR_SUB
28380 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20 73  CLAUSE flag is s
28390 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75  et, then we shou
283a0 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e  ld.  ** only gen
283b0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
283c0 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69  he first table i
283d0 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  n pTabList and a
283e0 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20  ssume that.  ** 
283f0 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f  any cursors asso
28400 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73  ciated with subs
28410 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72  equent tables ar
28420 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
28430 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74  .  */.  nTabList
28440 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26   = (wctrlFlags &
28450 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
28460 55 53 45 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  USE) ? 1 : pTabL
28470 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
28480 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
28490 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
284a0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
284b0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
284c0 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
284d0 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
284e0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
284f0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
28500 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
28510 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
28520 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
28530 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
28540 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
28550 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
28560 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
28570 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
28580 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
28590 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
285a0 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
285b0 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
285c0 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
285d0 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
285e0 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
285f0 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
28600 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
28610 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74  low..  */.  nByt
28620 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
28630 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
28640 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
28650 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
28660 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
28670 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
28680 72 6f 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66  ro(db, nByteWInf
28690 6f 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65  o + sizeof(Where
286a0 4c 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62  Loop));.  if( db
286b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
286c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
286d0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
286e0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
286f0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
28700 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
28710 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
28720 65 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66  ePass[0] = pWInf
28730 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
28740 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66  1] = -1;.  pWInf
28750 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62  o->nLevel = nTab
28760 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
28770 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
28780 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  .  pWInfo->pTabL
28790 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
287a0 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
287b0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
287c0 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e   pWInfo->pDistin
287d0 63 74 53 65 74 20 3d 20 70 44 69 73 74 69 6e 63  ctSet = pDistinc
287e0 74 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  tSet;.  pWInfo->
287f0 69 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d  iBreak = pWInfo-
28800 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  >iContinue = sql
28810 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28820 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
28830 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
28840 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
28850 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78  o->iLimit = iAux
28860 41 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  Arg;.  pWInfo->s
28870 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
28880 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
28890 6f 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oop;.  assert( p
288a0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
288b0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20  =ONEPASS_OFF ); 
288c0 20 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61   /* ONEPASS defa
288d0 75 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20  ults to OFF */. 
288e0 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49   pMaskSet = &pWI
288f0 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20  nfo->sMaskSet;. 
28900 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70   sWLB.pWInfo = p
28910 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57  WInfo;.  sWLB.pW
28920 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
28930 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20  ;.  sWLB.pNew = 
28940 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63  (WhereLoop*)(((c
28950 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79  har*)pWInfo)+nBy
28960 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  teWInfo);.  asse
28970 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
28980 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e  LIGNMENT(sWLB.pN
28990 65 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f  ew) );.  whereLo
289a0 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77  opInit(sWLB.pNew
289b0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
289c0 5f 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e  _DEBUG.  sWLB.pN
289d0 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23  ew->cId = '*';.#
289e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69  endif..  /* Spli
289f0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
28a00 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
28a10 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
28a20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
28a30 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
28a40 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
28a50 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
28a60 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
28a70 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  t(pMaskSet);.  s
28a80 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
28a90 65 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73  eInit(&pWInfo->s
28aa0 57 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73  WC, pWInfo);.  s
28ab0 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74  qlite3WhereSplit
28ac0 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70  (&pWInfo->sWC, p
28ad0 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
28ae0 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
28af0 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
28b00 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
28b10 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
28b20 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
28b30 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
28b40 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
28b50 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
28b60 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
28b70 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57   for(ii=0; ii<sW
28b80 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  LB.pWC->nTerm; i
28b90 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54  i++){.    if( nT
28ba0 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
28bb0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
28bc0 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70  ntNotJoin(sWLB.p
28bd0 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  WC->a[ii].pExpr)
28be0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28bf0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
28c00 72 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61  rse, sWLB.pWC->a
28c10 5b 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e  [ii].pExpr, pWIn
28c20 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20  fo->iBreak,.    
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50       SQLITE_JUMP
28c50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
28c60 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77  WLB.pWC->a[ii].w
28c70 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
28c80 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
28c90 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
28ca0 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
28cb0 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
28cc0 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
28cd0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
28ce0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
28cf0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
28d00 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46  ;.    if( wctrlF
28d10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
28d20 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
28d30 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
28d40 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
28d50 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
28d60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
28d70 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
28d80 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
28d90 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
28da0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
28db0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74   **.  ** The N-t
28dc0 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  h term of the FR
28dd0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73  OM clause is ass
28de0 69 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20  igned a bitmask 
28df0 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20  of 1<<N..  **.  
28e00 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74  ** The rule of t
28e10 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
28e20 65 6e 63 65 20 65 6e 73 75 72 65 73 20 74 68 74  ence ensures tht
28e30 61 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  a if X is the bi
28e40 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61  tmask for.  ** a
28e50 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58   table T, then X
28e60 2d 31 20 69 73 20 74 68 65 20 62 69 74 6d 61 73  -1 is the bitmas
28e70 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20  k for all other 
28e80 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
28e90 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e  ft of T..  ** Kn
28ea0 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
28eb0 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
28ec0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
28ed0 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20  a left join is. 
28ee0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   ** important.  
28ef0 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
28f00 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
28f10 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
28f20 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
28f30 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
28f40 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61  bles in.  ** pTa
28f50 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
28f60 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
28f70 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
28f80 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
28f90 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70  .  ** equal to p
28fa0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75  TabList->nSrc bu
28fb0 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  t might be short
28fc0 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65  ened to 1 if the
28fd0 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53  .  ** WHERE_OR_S
28fe0 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73  UBCLAUSE flag is
28ff0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   set..  */.  for
29000 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
29010 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
29020 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28  .    createMask(
29030 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
29040 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
29050 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  r);.    sqlite3W
29060 68 65 72 65 54 61 62 46 75 6e 63 41 72 67 73 28  hereTabFuncArgs(
29070 70 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73  pParse, &pTabLis
29080 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66  t->a[ii], &pWInf
29090 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66  o->sWC);.  }.#if
290a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
290b0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
290c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
290d0 69 69 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61  ii++){.    Bitma
290e0 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  sk m = sqlite3Wh
290f0 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b  ereGetMask(pMask
29100 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
29110 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
29120 20 20 20 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41     assert( m==MA
29130 53 4b 42 49 54 28 69 69 29 20 29 3b 0a 20 20 7d  SKBIT(ii) );.  }
29140 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
29150 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
29160 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
29170 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
29180 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54  reExprAnalyze(pT
29190 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
291a0 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d  >sWC);.  if( db-
291b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
291c0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
291d0 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77 63 74  rror;..  if( wct
291e0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
291f0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
29200 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
29210 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
29220 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26  rse, pTabList, &
29230 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 44 69  pWInfo->sWC, pDi
29240 73 74 69 6e 63 74 53 65 74 29 20 29 7b 0a 20 20  stinctSet) ){.  
29250 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
29260 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70  NCT marking is p
29270 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72  ointless.  Ignor
29280 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70  e it. */.      p
29290 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
292a0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
292b0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65  T_UNIQUE;.    }e
292c0 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72 42 79  lse if( pOrderBy
292d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
292e0 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20  Try to ORDER BY 
292f0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
29300 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20  o make distinct 
29310 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65  processing easie
29320 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  r */.      pWInf
29330 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d  o->wctrlFlags |=
29340 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
29350 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  Y;.      pWInfo-
29360 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 44 69 73  >pOrderBy = pDis
29370 74 69 6e 63 74 53 65 74 3b 0a 20 20 20 20 7d 0a  tinctSet;.    }.
29380 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72    }..  /* Constr
29390 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  uct the WhereLoo
293a0 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  p objects */.#if
293b0 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
293c0 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
293d0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
293e0 72 61 63 65 20 26 20 30 78 66 66 66 66 20 29 7b  race & 0xffff ){
293f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
29400 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20 4f 70 74  gPrintf("*** Opt
29410 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
29420 20 28 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78   (wctrlFlags: 0x
29430 25 78 22 2c 77 63 74 72 6c 46 6c 61 67 73 29 3b  %x",wctrlFlags);
29440 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c  .    if( wctrlFl
29450 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
29460 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 73  LIMIT ){.      s
29470 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29480 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25 64 22 2c  f(", limit: %d",
29490 20 69 41 75 78 41 72 67 29 3b 0a 20 20 20 20 7d   iAuxArg);.    }
294a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
294b0 67 50 72 69 6e 74 66 28 22 29 5c 6e 22 29 3b 0a  gPrintf(")\n");.
294c0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
294d0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
294e0 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61  100 ){ /* Displa
294f0 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  y all terms of t
29500 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
29510 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
29520 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73  ereClausePrint(s
29530 57 4c 42 2e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  WLB.pWC);.  }.#e
29540 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 54 61 62  ndif..  if( nTab
29550 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65  List!=1 || where
29560 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d  ShortCut(&sWLB)=
29570 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  =0 ){.    rc = w
29580 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26  hereLoopAddAll(&
29590 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72  sWLB);.    if( r
295a0 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  c ) goto whereBe
295b0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66  ginError;.  .#if
295c0 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
295d0 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
295e0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
295f0 20 29 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c 61   ){    /* Displa
29600 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65  y all of the Whe
29610 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
29620 2f 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  /.      WhereLoo
29630 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  p *p;.      int 
29640 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  i;.      static 
29650 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61 62 65  const char zLabe
29660 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  l[] = "012345678
29670 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  9abcdefghijklmno
29680 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20  pqrstuvwyxz".   
29690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296b0 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45            "ABCDE
296c0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
296d0 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f  VWYXZ";.      fo
296e0 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  r(p=pWInfo->pLoo
296f0 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d  ps, i=0; p; p=p-
29700 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29  >pNextLoop, i++)
29710 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
29720 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65   = zLabel[i%size
29730 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20  of(zLabel)];.   
29740 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
29750 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29  int(p, sWLB.pWC)
29760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29770 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68  #endif.  .    wh
29780 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
29790 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  Info, 0);.    if
297a0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
297b0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
297c0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  eginError;.    i
297d0 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
297e0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68  rBy ){.       wh
297f0 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
29800 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  Info, pWInfo->nR
29810 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20  owOut+1);.      
29820 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
29830 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
29840 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
29850 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
29860 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
29870 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  0 && (db->flags 
29880 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
29890 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  Order)!=0 ){.   
298a0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
298b0 6b 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d  k = ALLBITS;.  }
298c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
298d0 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  Err || NEVER(db-
298e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
298f0 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
29900 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
29910 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
29920 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
29930 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
29940 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
29950 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
29960 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d  - Solution nRow=
29970 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  %d", pWInfo->nRo
29980 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  wOut);.    if( p
29990 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20  WInfo->nOBSat>0 
299a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
299b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
299c0 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22  DERBY=%d,0x%llx"
299d0 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  , pWInfo->nOBSat
299e0 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
299f0 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
29a00 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
29a10 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
29a20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
29a30 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
29a40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
29a50 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
29a60 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
29a70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
29a90 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
29aa0 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
29ab0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
29ac0 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
29ad0 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
29ae0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29af0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
29b00 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
29b10 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
29b20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
29b30 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
29b40 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
29b50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29b70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
29b80 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
29b90 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
29ba0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
29bb0 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
29bc0 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
29bd0 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57  a[ii].pWLoop, sW
29be0 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  LB.pWC);.    }. 
29bf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41   }.#endif.  /* A
29c00 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74  ttempt to omit t
29c10 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a  ables from the j
29c20 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  oin that do not 
29c30 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  effect the resul
29c40 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  t */.  if( pWInf
29c50 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
29c60 26 26 20 70 44 69 73 74 69 6e 63 74 53 65 74 21  && pDistinctSet!
29c70 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
29c80 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
29c90 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
29ca0 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
29cb0 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
29cc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
29cd0 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b  rListUsage(pMask
29ce0 53 65 74 2c 20 70 44 69 73 74 69 6e 63 74 53 65  Set, pDistinctSe
29cf0 74 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42  t);.    if( sWLB
29d00 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
29d10 20 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71     tabUsed |= sq
29d20 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69  lite3WhereExprLi
29d30 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  stUsage(pMaskSet
29d40 2c 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29  , sWLB.pOrderBy)
29d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
29d60 65 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  e( pWInfo->nLeve
29d70 6c 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68  l>=2 ){.      Wh
29d80 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
29d90 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f  *pEnd;.      pLo
29da0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70  op = pWInfo->a[p
29db0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d  WInfo->nLevel-1]
29dc0 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  .pWLoop;.      i
29dd0 66 28 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62  f( (pWInfo->pTab
29de0 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69  List->a[pLoop->i
29df0 54 61 62 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  Tab].fg.jointype
29e00 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29   & JT_LEFT)==0 )
29e10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
29e20 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
29e30 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
29e40 4e 43 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  NCT)==0.       &
29e50 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
29e60 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
29e70 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
29e80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29e90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
29ea0 74 61 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d  tabUsed & pLoop-
29eb0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20  >maskSelf)!=0 ) 
29ec0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e  break;.      pEn
29ed0 64 20 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20  d = sWLB.pWC->a 
29ee0 2b 20 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  + sWLB.pWC->nTer
29ef0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65  m;.      for(pTe
29f00 72 6d 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20  rm=sWLB.pWC->a; 
29f10 70 54 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72  pTerm<pEnd; pTer
29f20 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
29f30 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
29f40 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  All & pLoop->mas
29f50 6b 53 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20  kSelf)!=0.      
29f60 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
29f70 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
29f80 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
29f90 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
29fa0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29fc0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c        if( pTerm<
29fd0 70 45 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  pEnd ) break;.  
29fe0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
29ff0 78 66 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70  xffff, ("-> drop
2a000 20 6c 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65   loop %c not use
2a010 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64  d\n", pLoop->cId
2a020 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
2a030 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20  ->nLevel--;.    
2a040 20 20 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20    nTabList--;.  
2a050 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
2a060 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a  RACE(0xffff,("**
2a070 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
2a080 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  shed ***\n"));. 
2a090 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
2a0a0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70  >nQueryLoop += p
2a0b0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a  WInfo->nRowOut;.
2a0c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
2a0d0 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
2a0e0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
2a0f0 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
2a100 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
2a110 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
2a120 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
2a130 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
2a140 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2f  ppropriate..  */
2a150 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
2a160 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2a170 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2a180 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
2a190 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
2a1a0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2a1b0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2a1c0 49 52 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  IRED)!=0 ){.    
2a1d0 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 70 57  int wsFlags = pW
2a1e0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
2a1f0 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2a200 69 6e 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77  int bOnerow = (w
2a210 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2a220 4e 45 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20 69  NEROW)!=0;.    i
2a230 66 28 20 62 4f 6e 65 72 6f 77 0a 20 20 20 20 20  f( bOnerow.     
2a240 7c 7c 20 28 28 77 63 74 72 6c 46 6c 61 67 73 20  || ((wctrlFlags 
2a250 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a260 4d 55 4c 54 49 52 4f 57 29 21 3d 30 0a 20 20 20  MULTIROW)!=0.   
2a270 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 28 77          && 0==(w
2a280 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2a290 49 52 54 55 41 4c 54 41 42 4c 45 29 29 0a 20 20  IRTUALTABLE)).  
2a2a0 20 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66    ){.      pWInf
2a2b0 6f 2d 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f  o->eOnePass = bO
2a2c0 6e 65 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f  nerow ? ONEPASS_
2a2d0 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53  SINGLE : ONEPASS
2a2e0 5f 4d 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66  _MULTI;.      if
2a2f0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c  ( HasRowid(pTabL
2a300 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20  ist->a[0].pTab) 
2a310 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  && (wsFlags & WH
2a320 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
2a330 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 63 74  .        if( wct
2a340 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2a350 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
2a360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
2a370 6f 72 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41  ordelete = OPFLA
2a380 47 5f 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20  G_FORDELETE;.   
2a390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2a3a0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
2a3b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77  op->wsFlags = (w
2a3c0 73 46 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f  sFlags & ~WHERE_
2a3d0 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  IDX_ONLY);.     
2a3e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2a3f0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
2a400 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
2a410 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
2a420 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
2a430 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
2a440 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
2a450 2f 0a 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c  /.  for(ii=0, pL
2a460 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2a470 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
2a480 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2a490 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2a4a0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
2a4b0 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
2a4c0 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
2a4d0 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
2a4e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
2a4f0 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  e/index */.    s
2a500 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2a510 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20  em *pTabItem;.. 
2a520 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
2a530 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2a540 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
2a550 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2a560 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20  pTab;.    iDb = 
2a570 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2a580 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
2a590 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f  Schema);.    pLo
2a5a0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
2a5b0 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54  oop;.    if( (pT
2a5c0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
2a5d0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
2a5e0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2a5f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
2a600 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
2a610 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
2a620 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2a630 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
2a640 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2a650 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2a660 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
2a670 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
2a680 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
2a690 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
2a6a0 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
2a6b0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
2a6c0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2a6d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a6e0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2a6f0 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
2a700 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
2a710 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  B);.    }else if
2a720 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2a730 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  ) ){.      /* no
2a740 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  op */.    }else.
2a750 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
2a760 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2a770 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2a780 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2a790 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a7a0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2a7b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
2a7c0 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65  t op = OP_OpenRe
2a7d0 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  ad;.      if( pW
2a7e0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
2a7f0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
2a800 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
2a810 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  penWrite;.      
2a820 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f    pWInfo->aiCurO
2a830 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62  nePass[0] = pTab
2a840 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2a850 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71       };.      sq
2a860 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
2a870 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
2a880 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
2a890 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20  Tab, op);.      
2a8a0 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d  assert( pTabItem
2a8b0 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65  ->iCursor==pLeve
2a8c0 6c 2d 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20  l->iTabCur );.  
2a8d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
2a8e0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2a8f0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2a900 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
2a910 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2a920 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
2a930 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2a940 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
2a950 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
2a960 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2a970 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2a980 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d  && pTab->nCol<BM
2a990 53 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54  S && HasRowid(pT
2a9a0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42  ab) ){.        B
2a9b0 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
2a9c0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
2a9d0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
2a9e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
2a9f0 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
2aa00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2aa10 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2aa20 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  -1, SQLITE_INT_T
2aa30 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
2aa40 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
2aa50 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
2aa60 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  ol );.      }.#i
2aa70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2aa80 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
2aa90 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2aaa0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
2aab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2aac0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2aad0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b  5(v, OPFLAG_SEEK
2aae0 45 51 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a  EQ|bFordelete);.
2aaf0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2ab00 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
2ab10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2ab20 61 6e 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65  angeP5(v, bForde
2ab30 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lete);.      }.#
2ab40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2ab50 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2ab60 4d 41 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74  MASK.      sqlit
2ab70 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2ab80 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
2ab90 65 64 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  ed, pTabItem->iC
2aba0 75 72 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20  ursor, 0, 0,.   
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abc0 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
2abd0 75 38 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63  u8*)&pTabItem->c
2abe0 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
2abf0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
2ac00 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2ac10 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
2ac20 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
2ac30 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
2ac40 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2ac50 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2ac60 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2ac70 45 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  ED ){.      Inde
2ac80 78 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e  x *pIx = pLoop->
2ac90 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
2aca0 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78        int iIndex
2acb0 43 75 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  Cur;.      int o
2acc0 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b  p = OP_OpenRead;
2acd0 0a 20 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72  .      /* iAuxAr
2ace0 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  g is always set 
2acf0 69 66 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  if to a positive
2ad00 20 76 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53   value if ONEPAS
2ad10 53 20 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f  S is possible */
2ad20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2ad30 41 75 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57  AuxArg!=0 || (pW
2ad40 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2ad50 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2ad60 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a  _DESIRED)==0 );.
2ad70 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
2ad80 77 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50  wid(pTab) && IsP
2ad90 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2ada0 49 78 29 0a 20 20 20 20 20 20 20 26 26 20 28 77  Ix).       && (w
2adb0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2adc0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21  E_OR_SUBCLAUSE)!
2add0 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
2ade0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f      /* This is o
2adf0 6e 65 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52  ne term of an OR
2ae00 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73  -optimization us
2ae10 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20  ing the PRIMARY 
2ae20 4b 45 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20  KEY of a.       
2ae30 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49   ** WITHOUT ROWI
2ae40 44 20 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65  D table.  No nee
2ae50 64 20 66 6f 72 20 61 20 73 65 70 61 72 61 74 65  d for a separate
2ae60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2ae70 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c    iIndexCur = pL
2ae80 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20  evel->iTabCur;. 
2ae90 20 20 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20         op = 0;. 
2aea0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2aeb0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21  WInfo->eOnePass!
2aec0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a  =ONEPASS_OFF ){.
2aed0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2aee0 4a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  J = pTabItem->pT
2aef0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
2af00 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20      iIndexCur = 
2af10 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20  iAuxArg;.       
2af20 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c   assert( wctrlFl
2af30 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2af40 41 53 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20  ASS_DESIRED );. 
2af50 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c         while( AL
2af60 57 41 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d  WAYS(pJ) && pJ!=
2af70 70 49 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pIx ){.         
2af80 20 69 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20   iIndexCur++;.  
2af90 20 20 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d          pJ = pJ-
2afa0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
2afb0 7d 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  }.        op = O
2afc0 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
2afd0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43       pWInfo->aiC
2afe0 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69  urOnePass[1] = i
2aff0 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
2b000 7d 65 6c 73 65 20 69 66 28 20 69 41 75 78 41 72  }else if( iAuxAr
2b010 67 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  g && (wctrlFlags
2b020 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
2b030 4c 41 55 53 45 29 21 3d 30 20 29 7b 0a 20 20 20  LAUSE)!=0 ){.   
2b040 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
2b050 20 69 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20   iAuxArg;.      
2b060 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e    op = OP_Reopen
2b070 49 64 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Idx;.      }else
2b080 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
2b090 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
2b0a0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ab++;.      }.  
2b0b0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
2b0c0 43 75 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  Cur = iIndexCur;
2b0d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b0e0 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
2b0f0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
2b100 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e 64      assert( iInd
2b110 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  exCur>=0 );.    
2b120 20 20 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20    if( op ){.    
2b130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b140 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e  ddOp3(v, op, iIn
2b150 64 65 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  dexCur, pIx->tnu
2b160 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
2b170 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
2b180 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
2b190 20 70 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69   pIx);.        i
2b1a0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2b1b0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
2b1c0 52 41 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20  RAINT)!=0.      
2b1d0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
2b1e0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
2b1f0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
2b200 45 5f 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a  E_SKIPSCAN))==0.
2b210 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
2b220 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26  nfo->wctrlFlags&
2b230 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2b240 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  N)==0.        ){
2b250 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b260 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2b270 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29  , OPFLAG_SEEKEQ)
2b280 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d  ; /* Hint to COM
2b290 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  DB2 */.        }
2b2a0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2b2b0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
2b2c0 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66  Ix->zName));.#if
2b2d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2b2e0 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
2b2f0 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  SK.        {.   
2b300 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73         u64 colUs
2b310 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
2b320 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20    int ii, jj;.  
2b330 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
2b340 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d  ; ii<pIx->nColum
2b350 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n; ii++){.      
2b360 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e        jj = pIx->
2b370 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20  aiColumn[ii];.  
2b380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a            if( jj
2b390 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
2b3a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
2b3b0 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a  j>63 ) jj = 63;.
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b3d0 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  (pTabItem->colUs
2b3e0 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29  ed & MASKBIT(jj)
2b3f0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
2b400 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
2b410 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29  Used |= ((u64)1)
2b420 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20  <<(ii<63 ? ii : 
2b430 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  63);.          }
2b440 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b450 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2b460 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
2b470 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30  ed, iIndexCur, 0
2b480 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4a0 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73       (u8*)&colUs
2b4b0 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ed, P4_INT64);. 
2b4c0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
2b4d0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
2b4e0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
2b4f0 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  K */.      }.   
2b500 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d   }.    if( iDb>=
2b510 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  0 ) sqlite3CodeV
2b520 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2b530 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
2b540 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
2b550 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2b560 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
2b570 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b580 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2b590 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
2b5a0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
2b5b0 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
2b5c0 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
2b5d0 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
2b5e0 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
2b5f0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
2b600 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
2b610 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
2b620 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
2b630 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
2b640 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
2b650 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62  or(ii=0; ii<nTab
2b660 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  List; ii++){.   
2b670 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
2b680 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  ;.    int wsFlag
2b690 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  s;.    pLevel = 
2b6a0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a  &pWInfo->a[ii];.
2b6b0 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c      wsFlags = pL
2b6c0 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73  evel->pWLoop->ws
2b6d0 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53  Flags;.#ifndef S
2b6e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
2b6f0 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
2b700 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  f( (pLevel->pWLo
2b710 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2b720 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
2b730 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2b740 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
2b750 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57 49  dex(pParse, &pWI
2b760 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20  nfo->sWC,.      
2b770 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 4c            &pTabL
2b780 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2b790 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c  From], notReady,
2b7a0 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
2b7b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2b7c0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
2b7d0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
2b7e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64   }.#endif.    ad
2b7f0 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69  drExplain = sqli
2b800 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f  te3WhereExplainO
2b810 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
2b820 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2b830 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c  , pLevel, ii, pL
2b840 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74  evel->iFrom, wct
2b850 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20  rlFlags.    );. 
2b860 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42     pLevel->addrB
2b870 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
2b880 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2b890 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  .    notReady = 
2b8a0 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65  sqlite3WhereCode
2b8b0 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49  OneLoopStart(pWI
2b8c0 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64  nfo, ii, notRead
2b8d0 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
2b8e0 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76  iContinue = pLev
2b8f0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20  el->addrCont;.  
2b900 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 26 57    if( (wsFlags&W
2b910 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
2b920 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  0 && (wctrlFlags
2b930 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41  &WHERE_OR_SUBCLA
2b940 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  USE)==0 ){.     
2b950 20 73 71 6c 69 74 65 33 57 68 65 72 65 41 64 64   sqlite3WhereAdd
2b960 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54  ScanStatus(v, pT
2b970 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
2b980 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20  addrExplain);.  
2b990 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f    }.  }..  /* Do
2b9a0 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ne. */.  VdbeMod
2b9b0 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
2b9c0 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65  Begin WHERE-core
2b9d0 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  "));.  return pW
2b9e0 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
2b9f0 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
2ba00 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
2ba10 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20  ginError:.  if( 
2ba20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50  pWInfo ){.    pP
2ba30 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2ba40 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
2ba50 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  NQueryLoop;.    
2ba60 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
2ba70 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20  , pWInfo);.  }. 
2ba80 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2ba90 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
2baa0 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2bab0 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d  E loop.  See com
2bac0 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c  ments on .** sql
2bad0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2bae0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2baf0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2bb00 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
2bb10 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  eEnd(WhereInfo *
2bb20 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65  pWInfo){.  Parse
2bb30 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
2bb40 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62  o->pParse;.  Vdb
2bb50 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2bb60 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2bb70 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
2bb80 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  vel;.  WhereLoop
2bb90 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69   *pLoop;.  SrcLi
2bba0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
2bbb0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
2bbc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2bbd0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2bbe0 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
2bbf0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
2bc00 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  e..  */.  VdbeMo
2bc10 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
2bc20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22  "End WHERE-core"
2bc30 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ));.  sqlite3Exp
2bc40 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2bc50 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49  se);.  for(i=pWI
2bc60 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69  nfo->nLevel-1; i
2bc70 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
2bc80 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65  nt addr;.    pLe
2bc90 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
2bca0 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  [i];.    pLoop =
2bcb0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
2bcc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2bcd0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2bce0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
2bcf0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
2bd00 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
2bd10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2bd20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
2bd30 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
2bd40 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
2bd50 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
2bd60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2bd70 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
2bd80 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
2bd90 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2bda0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2bdb0 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2bdc0 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
2bdd0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2bde0 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2bdf0 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
2be00 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2be10 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2be20 50 5f 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  P_VNext);.    }.
2be30 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
2be40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2be50 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
2be60 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
2be70 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
2be80 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
2be90 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
2bea0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2beb0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
2bec0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
2bed0 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
2bee0 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
2bef0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
2bf00 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
2bf10 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
2bf20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2bf30 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
2bf40 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
2bf50 20 20 20 20 69 66 28 20 70 49 6e 2d 3e 65 45 6e      if( pIn->eEn
2bf60 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70  dLoopOp!=OP_Noop
2bf70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2bf80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2bf90 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
2bfa0 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  Op, pIn->iCur, p
2bfb0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
2bfc0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
2bfd0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2bfe0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2bff0 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  eIf(v, pIn->eEnd
2c000 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49  LoopOp==OP_PrevI
2c010 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  fOpen);.        
2c020 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2c030 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
2c040 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70  pOp==OP_NextIfOp
2c050 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  en);.        }. 
2c060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c070 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
2c080 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b  n->addrInTop-1);
2c090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c0a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2c0b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2c0c0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
2c0d0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2c0e0 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20  addrSkip ){.    
2c0f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
2c100 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
2c110 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64  rSkip);.      Vd
2c120 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
2c130 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e  ext skip-scan on
2c140 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62   %s", pLoop->u.b
2c150 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
2c160 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
2c170 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2c180 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
2c190 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  kip);.      sqli
2c1a0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2c1b0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
2c1c0 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69  kip-2);.    }.#i
2c1d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  fndef SQLITE_LIK
2c1e0 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
2c1f0 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70 4c 65  LOBS.    if( pLe
2c200 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
2c210 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2c220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2c230 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
2c240 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c  (int)(pLevel->iL
2c250 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a  ikeRepCntr>>1),.
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c270 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
2c280 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20  addrLikeRep);.  
2c290 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2c2a0 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  (v);.    }.#endi
2c2b0 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  f.    if( pLevel
2c2c0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
2c2d0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
2c2e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2c2f0 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
2c300 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56  l->iLeftJoin); V
2c310 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2c320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2c330 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c340 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2c350 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
2c360 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2c370 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2c380 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
2c390 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2c3a0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2c3b0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
2c3c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c3d0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
2c3e0 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  w, pTabList->a[i
2c3f0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
2c400 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
2c410 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2c420 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
2c430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c440 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2c450 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
2c460 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
2c470 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
2c480 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
2c490 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
2c4a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c4b0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
2c4c0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
2c4d0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
2c4e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c4f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
2c500 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  o(v, pLevel->add
2c510 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2c520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c530 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2c540 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56  dr);.    }.    V
2c550 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2c560 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d  ((v, "End WHERE-
2c570 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a  loop%d: %s", i,.
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c590 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61       pWInfo->pTa
2c5a0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2c5b0 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e  >iFrom].pTab->zN
2c5c0 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ame));.  }..  /*
2c5d0 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
2c5e0 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
2c5f0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2c600 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
2c610 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
2c620 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
2c630 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2c640 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
2c650 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ..  assert( pWIn
2c660 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62  fo->nLevel<=pTab
2c670 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2c680 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
2c690 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
2c6a0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
2c6b0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
2c6c0 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20   int k, last;.  
2c6d0 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2c6e0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
2c6f0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   0;.    struct S
2c700 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
2c710 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
2c720 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2c730 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
2c740 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
2c750 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
2c760 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
2c770 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
2c780 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f  ->pWLoop;..    /
2c790 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69  * For a co-routi
2c7a0 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f  ne, change all O
2c7b0 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  P_Column referen
2c7c0 63 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ces to the table
2c7d0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
2c7e0 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f  o-routine into O
2c7f0 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74  P_Copy of result
2c800 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20   contained in a 
2c810 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a  register..    **
2c820 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65   OP_Rowid become
2c830 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a  s OP_Null..    *
2c840 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74  /.    if( pTabIt
2c850 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2c860 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  ine && !db->mall
2c870 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2c880 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d    translateColum
2c890 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c 65 76 65  nToCopy(v, pLeve
2c8a0 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 65  l->addrBody, pLe
2c8b0 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20  vel->iTabCur,.  
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8d0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74            pTabIt
2c8e0 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 30  em->regResult, 0
2c8f0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
2c900 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
2c910 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
2c920 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
2c930 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
2c940 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
2c950 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  .    ** Except, 
2c960 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63 75 72  do not close cur
2c970 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c 20 62  sors that will b
2c980 65 20 72 65 75 73 65 64 20 62 79 20 74 68 65 20  e reused by the 
2c990 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  OR optimization.
2c9a0 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f 4f 52      ** (WHERE_OR
2c9b0 5f 53 55 42 43 4c 41 55 53 45 29 2e 20 20 41 6e  _SUBCLAUSE).  An
2c9c0 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 74  d do not close t
2c9d0 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  he OP_OpenWrite 
2c9e0 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a 20 63  cursors.    ** c
2c9f0 72 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 4f  reated for the O
2ca00 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74  NEPASS optimizat
2ca10 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
2ca20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2ca30 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2ca40 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
2ca50 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
2ca60 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2ca70 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2ca80 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2ca90 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
2caa0 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70    int ws = pLoop
2cab0 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  ->wsFlags;.     
2cac0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2cad0 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2cae0 46 46 20 26 26 20 28 77 73 20 26 20 57 48 45 52  FF && (ws & WHER
2caf0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
2cb00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2cb10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2cb20 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
2cb30 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2cb40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
2cb50 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
2cb60 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  ED)!=0.       &&
2cb70 20 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50   (ws & (WHERE_IP
2cb80 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  K|WHERE_AUTO_IND
2cb90 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  EX))==0 .       
2cba0 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  && pLevel->iIdxC
2cbb0 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ur!=pWInfo->aiCu
2cbc0 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20 20 20  rOnePass[1].    
2cbd0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
2cbe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2cbf0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76  , OP_Close, pLev
2cc00 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
2cc10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2cc20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e   /* If this scan
2cc30 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
2cc40 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65 20 73  make VDBE code s
2cc50 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20  ubstitutions to 
2cc60 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a  read data.    **
2cc70 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
2cc80 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f 6d 20  instead of from 
2cc90 74 68 65 20 74 61 62 6c 65 20 77 68 65 72 65 20  the table where 
2cca0 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20 73 6f  possible.  In so
2ccb0 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a 2a 20  me cases.    ** 
2ccc0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
2ccd0 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 74  n prevents the t
2cce0 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72 20 62  able from ever b
2ccf0 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69 63 68  eing read, which
2cd00 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69 65 6c   can.    ** yiel
2cd10 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20  d a significant 
2cd20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
2cd30 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  t..    ** .    *
2cd40 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
2cd50 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
2cd60 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
2cd70 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
2cd80 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
2cd90 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
2cda0 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
2cdb0 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
2cdc0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
2cdd0 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
2cde0 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
2cdf0 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
2ce00 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
2ce10 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
2ce20 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
2ce30 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
2ce40 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
2ce50 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
2ce60 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
2ce70 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
2ce80 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
2ce90 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f  E_INDEXED|WHERE_
2cea0 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
2ceb0 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
2cec0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
2ced0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
2cee0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2cef0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
2cf00 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
2cf10 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
2cf20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cf30 70 49 64 78 0a 20 20 20 20 20 26 26 20 28 70 57  pIdx.     && (pW
2cf40 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2cf50 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c 20 21  ONEPASS_OFF || !
2cf60 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
2cf70 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26 26 20  Table)).     && 
2cf80 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
2cf90 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6c  d.    ){.      l
2cfa0 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
2cfb0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2cfc0 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65 76 65  .      k = pLeve
2cfd0 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20 20 20  l->addrBody;.   
2cfe0 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
2cff0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b 29 3b  VdbeGetOp(v, k);
2d000 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b 3c 6c  .      for(; k<l
2d010 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
2d020 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
2d030 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
2d040 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
2d050 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
2d060 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
2d070 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2d080 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70 2d 3e     int x = pOp->
2d090 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  p2;.          as
2d0a0 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54 61 62  sert( pIdx->pTab
2d0b0 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
2d0c0 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
2d0d0 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
2d0e0 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
2d0f0 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
2d100 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
2d110 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
2d120 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
2d130 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[x];.          
2d140 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29    assert( x>=0 )
2d150 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d160 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69          x = sqli
2d170 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
2d180 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20 20 20  (pIdx, x);.     
2d190 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b       if( x>=0 ){
2d1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
2d1b0 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20 20 20  ->p2 = x;.      
2d1c0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
2d1d0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
2d1e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d1f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
2d200 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2d210 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2d220 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20  ==0 || x>=0 );. 
2d230 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2d240 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2d250 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
2d260 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
2d270 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
2d280 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
2d290 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
2d2a0 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
2d2b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2d2c0 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
2d2d0 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.  pPars
2d2e0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
2d2f0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2d300 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65  eryLoop;.  where
2d310 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
2d320 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
2d330 7d 0a                                            }.