/ Hex Artifact Content
Login

Artifact 43b53ef361d1b01002376eff5d33de0898f4dd94:


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 56  rInit = sqlite3V
5a90: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
5aa0: 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
5ab0: 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f  age(v);..  /* Co
5ac0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
5ad0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  f columns that w
5ae0: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
5af0: 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61  the index.  ** a
5b00: 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  nd used to match
5b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
5b20: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e  nstraints */.  n
5b30: 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  KeyCol = 0;.  pT
5b40: 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
5b50: 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  b;.  pWCEnd = &p
5b60: 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
5b70: 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
5b80: 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69  vel->pWLoop;.  i
5b90: 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
5ba0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
5bb0: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
5bc0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
5bd0: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
5be0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
5bf0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
5c00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
5c10: 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70  romJoin)    /* p
5c20: 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e  rereq always non
5c30: 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20  -zero */.       
5c40: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67    || pExpr->iRig
5c50: 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72  htJoinTable!=pSr
5c60: 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20  c->iCursor   /* 
5c70: 20 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d    for the right-
5c80: 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20  hand   */.      
5c90: 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65     || pLoop->pre
5ca0: 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20  req!=0 );       
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5cc0: 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45     table of a LE
5cd0: 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69  FT JOIN */.    i
5ce0: 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71  f( pLoop->prereq
5cf0: 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
5d00: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
5d10: 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20  RM_VIRTUAL)==0. 
5d20: 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
5d30: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
5d40: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20  P_FromJoin).    
5d50: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
5d60: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
5d70: 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72  Expr, pSrc->iCur
5d80: 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50  sor) ){.      pP
5d90: 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33  artial = sqlite3
5da0: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
5db0: 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20  db, pPartial,.  
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 20 20 20 20 20 20 73 71                sq
5de0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
5df0: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
5e00: 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  0));.    }.    i
5e10: 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
5e20: 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
5e30: 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
5e40: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
5e50: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
5e60: 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
5e70: 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
5e80: 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
5e90: 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
5ea0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
5eb0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
5ec0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
5ed0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
5ee0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65  );.      if( !se
5ef0: 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20  ntWarning ){.   
5f00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
5f10: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  (SQLITE_WARNING_
5f20: 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20  AUTOINDEX,.     
5f30: 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69         "automati
5f40: 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73  c index on %s(%s
5f50: 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  )", pTable->zNam
5f60: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e,.            p
5f70: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
5f80: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
5f90: 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20    sentWarning = 
5fa0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5fb0: 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
5fc0: 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
5fd0: 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f       if( whereLo
5fe0: 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d  opResize(pParse-
5ff0: 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79  >db, pLoop, nKey
6000: 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20  Col+1) ){.      
6010: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74      goto end_aut
6020: 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a  o_index_create;.
6030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6040: 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
6050: 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65  nKeyCol++] = pTe
6060: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  rm;.        idxC
6070: 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
6080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6090: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f    assert( nKeyCo
60a0: 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  l>0 );.  pLoop->
60b0: 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c  u.btree.nEq = pL
60c0: 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b  oop->nLTerm = nK
60d0: 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  eyCol;.  pLoop->
60e0: 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
60f0: 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
6100: 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
6110: 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20  RE_INDEXED.     
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  | WHERE_AUTO_IND
6140: 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  EX;..  /* Count 
6150: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64  the number of ad
6160: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
6170: 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74   needed to creat
6180: 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e  e a.  ** coverin
6190: 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76  g index.  A "cov
61a0: 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20  ering index" is 
61b0: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
61c0: 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20  ntains all.  ** 
61d0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
61e0: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71   needed by the q
61f0: 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f  uery.  With a co
6200: 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  vering index, th
6210: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
6220: 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64  table never need
6230: 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
6240: 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  .  Automatic ind
6250: 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ices must.  ** b
6260: 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  e a covering ind
6270: 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69  ex because the i
6280: 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
6290: 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a   updated if the.
62a0: 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
62b0: 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ble changes and 
62c0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
62d0: 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ble cannot both 
62e0: 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20  be used.  ** if 
62f0: 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73  they go out of s
6300: 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72  ync..  */.  extr
6310: 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f  aCols = pSrc->co
6320: 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c  lUsed & (~idxCol
6330: 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  s | MASKBIT(BMS-
6340: 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20  1));.  mxBitCol 
6350: 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62  = MIN(BMS-1,pTab
6360: 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73  le->nCol);.  tes
6370: 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
6380: 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
6390: 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
63a0: 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b  ->nCol==BMS-2 );
63b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
63c0: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
63d0: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
63e0: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e  & MASKBIT(i) ) n
63f0: 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20  KeyCol++;.  }.  
6400: 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
6410: 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  d & MASKBIT(BMS-
6420: 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f  1) ){.    nKeyCo
6430: 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  l += pTable->nCo
6440: 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d  l - BMS + 1;.  }
6450: 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
6460: 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
6470: 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  t to describe th
6480: 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49  is index */.  pI
6490: 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  dx = sqlite3Allo
64a0: 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
64b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79  pParse->db, nKey
64c0: 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55  Col+1, 0, &zNotU
64d0: 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78  sed);.  if( pIdx
64e0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61  ==0 ) goto end_a
64f0: 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
6500: 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
6510: 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
6520: 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
6530: 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
6540: 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
6550: 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
6560: 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
6570: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
6580: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
6590: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
65a0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
65b0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
65c0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
65d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
65e0: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
65f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
6600: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
6610: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
6620: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
6630: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
6640: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
6650: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
6660: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6670: 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  S );.      if( (
6680: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
6690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
66a0: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
66b0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
66c0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
66d0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
66e0: 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
66f0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
6700: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
6710: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
6720: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
6730: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
6740: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
6750: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
6760: 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f  oll[n] = pColl ?
6770: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
6780: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6790: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
67a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
67b0: 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
67c0: 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  n==pLoop->u.btre
67d0: 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  e.nEq );..  /* A
67e0: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
67f0: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
6800: 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
6810: 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
6820: 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
6830: 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
6840: 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
6850: 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
6860: 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28  aCols & MASKBIT(
6870: 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
6880: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
6890: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
68a0: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
68b0: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
68c0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
68d0: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
68e0: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
68f0: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f  BMS-1) ){.    fo
6900: 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61  r(i=BMS-1; i<pTa
6910: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
6920: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
6930: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
6940: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
6950: 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [n] = sqlite3Str
6960: 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b  BINARY;.      n+
6970: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
6980: 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f  ssert( n==nKeyCo
6990: 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  l );.  pIdx->aiC
69a0: 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f  olumn[n] = XN_RO
69b0: 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  WID;.  pIdx->azC
69c0: 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33  oll[n] = sqlite3
69d0: 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a  StrBINARY;..  /*
69e0: 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f   Create the auto
69f0: 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  matic index */. 
6a00: 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
6a10: 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20  >iIdxCur>=0 );. 
6a20: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
6a30: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
6a40: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
6a50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6a60: 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
6a70: 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65  el->iIdxCur, nKe
6a80: 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  yCol+1);.  sqlit
6a90: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
6aa0: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
6ab0: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
6ac0: 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
6ad0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
6ae0: 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
6af0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
6b00: 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
6b10: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6b20: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
6b30: 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d  pTabItem = &pWC-
6b40: 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
6b50: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
6b60: 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49  om];.  if( pTabI
6b70: 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
6b80: 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tine ){.    int 
6b90: 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49  regYield = pTabI
6ba0: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
6bb0: 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20      addrCounter 
6bc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6bd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6be0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 0, 0);.    sq
6bf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c00: 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
6c10: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30  ine, regYield, 0
6c20: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72  , pTabItem->addr
6c30: 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64  FillSub);.    ad
6c40: 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33  drTop =  sqlite3
6c50: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6c60: 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64  _Yield, regYield
6c70: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
6c80: 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
6c90: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
6ca0: 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22  t row of \"%s\""
6cb0: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
6cc0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c  ->zName));.  }el
6cd0: 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  se{.    addrTop 
6ce0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6cf0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
6d00: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
6d10: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
6d20: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
6d30: 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69  Partial ){.    i
6d40: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
6d50: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
6d60: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  v);.    sqlite3E
6d70: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
6d80: 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f  e, pPartial, iCo
6d90: 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a  ntinue, SQLITE_J
6da0: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
6db0: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
6dc0: 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49  = WHERE_PARTIALI
6dd0: 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63  DX;.  }.  regRec
6de0: 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
6df0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6e00: 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c  .  regBase = sql
6e10: 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
6e20: 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72  xKey(.      pPar
6e30: 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
6e40: 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
6e50: 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30  cord, 0, 0, 0, 0
6e60: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  .  );.  sqlite3V
6e70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6e80: 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
6e90: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
6ea0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
6eb0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
6ec0: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
6ed0: 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50  ESULT);.  if( pP
6ee0: 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33  artial ) sqlite3
6ef0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6f00: 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
6f10: 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
6f20: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6f30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6f40: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
6f50: 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61  drCounter, regBa
6f60: 73 65 2b 6e 29 3b 0a 20 20 20 20 74 72 61 6e 73  se+n);.    trans
6f70: 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79  lateColumnToCopy
6f80: 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65  (v, addrTop, pLe
6f90: 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54  vel->iTabCur, pT
6fa0: 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c  abItem->regResul
6fb0: 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 1);.    sqlit
6fc0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
6fd0: 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61 62  drTop);.    pTab
6fe0: 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
6ff0: 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  utine = 0;.  }el
7000: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
7010: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7020: 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Next, pLevel->iT
7030: 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31  abCur, addrTop+1
7040: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7050: 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
7060: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7070: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
7080: 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
7090: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
70a0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
70b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
70c0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
70d0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
70e0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
70f0: 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 0a  Pop(pParse);.  .
7100: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
7110: 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
7120: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
7130: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
7140: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
7150: 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74 6f  Init);..end_auto
7160: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a 20  _index_create:. 
7170: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7180: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
7190: 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e 64  Partial);.}.#end
71a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
71b0: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
71c0: 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  X */..#ifndef SQ
71d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
71e0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c  LTABLE./*.** All
71f0: 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  ocate and popula
7200: 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  te an sqlite3_in
7210: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7220: 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  re. It is the .*
7230: 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
7240: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
7250: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
7260: 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75  ease the structu
7270: 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67  re.** by passing
7280: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   the pointer ret
7290: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
72a0: 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65  nction to sqlite
72b0: 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
72c0: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  tic sqlite3_inde
72d0: 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65  x_info *allocate
72e0: 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72  IndexInfo(.  Par
72f0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68  se *pParse,.  Wh
7300: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a  ereClause *pWC,.
7310: 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61    Bitmask mUnusa
7320: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
7330: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72 6d    /* Ignore term
7340: 73 20 77 69 74 68 20 74 68 65 73 65 20 70 72 65  s with these pre
7350: 72 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  reqs */.  struct
7360: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
7370: 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
7380: 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 75 31 36  *pOrderBy,.  u16
7390: 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20 20 20   *pmNoOmit      
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20 6e 6f  Mask of terms no
73c0: 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b 0a  t to omit */.){.
73d0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
73e0: 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
73f0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7400: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
7410: 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
7420: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
7430: 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
7440: 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
7450: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7460: 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
7470: 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
7480: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
7490: 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
74a0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
74b0: 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d 4e  dxInfo;.  u16 mN
74c0: 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oOmit = 0;..  /*
74d0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
74e0: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
74f0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
7500: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
7510: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
7520: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
7530: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
7540: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7550: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7560: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
7570: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
7580: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
7590: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
75a0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
75b0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d  >prereqRight & m
75c0: 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69  Unusable ) conti
75d0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
75e0: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
75f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7600: 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
7610: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
7620: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7630: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
7640: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
7650: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
7660: 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
7670: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7680: 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
7690: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
76a0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
76b0: 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20  & WO_ALL );.    
76c0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
76d0: 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e  rator & ~(WO_ISN
76e0: 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f  ULL|WO_EQUIV|WO_
76f0: 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
7700: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7710: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
7720: 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
7730: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
7740: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
7750: 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20  umn>=(-1) );.   
7760: 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
7770: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
7780: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
7790: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
77a0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
77b0: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
77c0: 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
77d0: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
77e0: 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
77f0: 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
7800: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
7810: 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
7820: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
7830: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
7840: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65     int n = pOrde
7850: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
7860: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
7870: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
7880: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
7890: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
78a0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
78b0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
78c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
78d0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
78e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
78f0: 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20  if( i==n){.     
7900: 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20   nOrderBy = n;. 
7910: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7920: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
7930: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
7940: 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
7950: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
7960: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
7970: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
7980: 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
79b0: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
79c0: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
79d0: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
7a00: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
7a10: 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
7a20: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
7a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a40: 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
7a50: 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ory");.    retur
7a60: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
7a70: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
7a80: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
7a90: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7aa0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
7ab0: 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
7ac0: 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
7ad0: 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
7ae0: 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
7af0: 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
7b00: 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
7b10: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
7b20: 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
7b30: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
7b40: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
7b50: 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
7b60: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
7b70: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7b80: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
7b90: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
7ba0: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
7bb0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7bc0: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
7bd0: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
7be0: 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
7bf0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7c00: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
7c10: 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
7c20: 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
7c30: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
7c40: 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
7c50: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
7c60: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
7c70: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
7c80: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7c90: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
7ca0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
7cb0: 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
7cc0: 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
7cd0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
7ce0: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
7cf0: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
7d00: 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
7d10: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7d20: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7d30: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
7d40: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
7d50: 20 3d 0a 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: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
7da0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
7db0: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
7dc0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
7dd0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  rm++){.    u8 op
7de0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
7df0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
7e00: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
7e10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7e20: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
7e30: 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65 20  ght & mUnusable 
7e40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7e50: 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f  assert( IsPowerO
7e60: 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65  fTwo(pTerm->eOpe
7e70: 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49  rator & ~WO_EQUI
7e80: 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  V) );.    testca
7e90: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
7ea0: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
7eb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7ec0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7ed0: 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65   WO_IS );.    te
7ee0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7ef0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
7f00: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
7f10: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
7f20: 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
7f30: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
7f40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
7f50: 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
7f60: 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  UIV|WO_IS))==0 )
7f70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7f80: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
7f90: 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29  s & TERM_VNULL )
7fa0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
7fb0: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e  ssert( pTerm->u.
7fc0: 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29  leftColumn>=(-1)
7fd0: 20 29 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73   );.    pIdxCons
7fe0: 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
7ff0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8000: 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
8010: 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
8020: 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38   i;.    op = (u8
8030: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
8040: 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20  r & WO_ALL;.    
8050: 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20  if( op==WO_IN ) 
8060: 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20  op = WO_EQ;.    
8070: 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d 41 54 43 48  if( op==WO_MATCH
8080: 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 70   ){.      op = p
8090: 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 3b 0a  Term->eMatchOp;.
80a0: 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 43 6f      }.    pIdxCo
80b0: 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20  ns[j].op = op;. 
80c0: 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
80d0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
80e0: 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
80f0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
8100: 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  y because.    **
8110: 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
8120: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8130: 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
8140: 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
8150: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
8160: 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
8170: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
8180: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d    assert( WO_EQ=
8190: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
81a0: 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20  NSTRAINT_EQ );. 
81b0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
81c0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
81d0: 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
81e0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
81f0: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
8200: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
8210: 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
8220: 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
8230: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
8240: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
8250: 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
8260: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
8270: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
8280: 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
8290: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
82a0: 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73  _MATCH );.    as
82b0: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
82c0: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c  erator & (WO_IN|
82d0: 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
82e0: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  E|WO_GT|WO_GE|WO
82f0: 5f 4d 41 54 43 48 29 20 29 3b 0a 0a 20 20 20 20  _MATCH) );..    
8300: 69 66 28 20 6f 70 20 26 20 28 57 4f 5f 4c 54 7c  if( op & (WO_LT|
8310: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8320: 45 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  E).     && sqlit
8330: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
8340: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
8350: 67 68 74 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ght) .    ){.   
8360: 20 20 20 69 66 28 20 69 3c 31 36 20 29 20 6d 4e     if( i<16 ) mN
8370: 6f 4f 6d 69 74 20 7c 3d 20 28 31 20 3c 3c 20 69  oOmit |= (1 << i
8380: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  );.      if( op=
8390: 3d 57 4f 5f 4c 54 20 29 20 70 49 64 78 43 6f 6e  =WO_LT ) pIdxCon
83a0: 73 5b 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 4c 45 3b  s[j].op = WO_LE;
83b0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  .      if( op==W
83c0: 4f 5f 47 54 20 29 20 70 49 64 78 43 6f 6e 73 5b  O_GT ) pIdxCons[
83d0: 6a 5d 2e 6f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20  j].op = WO_GE;. 
83e0: 20 20 20 7d 0a 0a 20 20 20 20 6a 2b 2b 3b 0a 20     }..    j++;. 
83f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
8400: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
8410: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
8420: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
8430: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78  .pExpr;.    pIdx
8440: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
8450: 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
8460: 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  umn;.    pIdxOrd
8470: 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
8480: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
8490: 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
84a0: 2a 70 6d 4e 6f 4f 6d 69 74 20 3d 20 6d 4e 6f 4f  *pmNoOmit = mNoO
84b0: 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  mit;.  return pI
84c0: 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
84d0: 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
84e0: 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
84f0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
8500: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
8510: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
8520: 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
8530: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
8540: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
8550: 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
8560: 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
8570: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
8580: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
8590: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
85a0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63  object that.** c
85b0: 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33  omes in as the 3
85c0: 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
85d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
85e0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
85f0: 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
8600: 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
8610: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8620: 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
8630: 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
8640: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
8650: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
8660: 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
8670: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
8680: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8690: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
86a0: 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
86b0: 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
86c0: 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
86d0: 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
86e0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
86f0: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
8700: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
8710: 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
8720: 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
8730: 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
8740: 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
8750: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
8760: 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
8770: 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
8780: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
8790: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
87a0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
87b0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
87c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
87d0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
87e0: 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
87f0: 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45  int rc;..  TRACE
8800: 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
8810: 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
8820: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
8830: 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
8840: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
8850: 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
8860: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8870: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8880: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
8890: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70  qlite3OomFault(p
88a0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
88b0: 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
88c0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
88d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
88e0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
88f0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
8900: 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
8910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8920: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
8930: 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
8940: 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
8950: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
8960: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
8970: 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
8980: 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a  = 0;..#if 0.  /*
8990: 20 54 68 69 73 20 65 72 72 6f 72 20 69 73 20 6e   This error is n
89a0: 6f 77 20 63 61 75 67 68 74 20 62 79 20 74 68 65  ow caught by the
89b0: 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20 53 65   caller..  ** Se
89c0: 61 72 63 68 20 66 6f 72 20 22 78 42 65 73 74 49  arch for "xBestI
89d0: 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ndex malfunction
89e0: 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66 6f 72  " below */.  for
89f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
8a00: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
8a10: 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74    if( !p->aConst
8a20: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20  raint[i].usable 
8a30: 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  && p->aConstrain
8a40: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
8a50: 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  dex>0 ){.      s
8a60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8a70: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
8a80: 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65    "table %s: xBe
8a90: 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64  stIndex returned
8aa0: 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e   an invalid plan
8ab0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
8ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
8ad0: 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  f..  return pPar
8ae0: 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64  se->nErr;.}.#end
8af0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
8b00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
8b10: 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
8b20: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8b30: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
8b40: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
8b50: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
8b60: 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
8b70: 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
8b80: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
8b90: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
8ba0: 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
8bb0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
8bc0: 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
8bd0: 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
8be0: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65  ws less than pRe
8bf0: 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  c.**    aStat[1]
8c00: 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
8c10: 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
8c20: 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65  to pRec.**.** Re
8c30: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
8c40: 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61  f the sample tha
8c50: 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73  t is the smalles
8c60: 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a  t sample that.**
8c70: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
8c80: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
8c90: 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  c. Note that thi
8ca0: 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61  s index is not a
8cb0: 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20  n index.** into 
8cc0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
8cd0: 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69  ray - it is an i
8ce0: 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74  ndex into a virt
8cf0: 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  ual set of sampl
8d00: 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74  es.** based on t
8d10: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
8d20: 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65  Sample[] and the
8d30: 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
8d40: 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20  s in record .** 
8d50: 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  pRec. .*/.static
8d60: 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61   int whereKeySta
8d70: 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
8d80: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
8d90: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
8da0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
8db0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
8dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8dd0: 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
8de0: 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e  omain of */.  Un
8df0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
8e00: 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63  ec,       /* Vec
8e10: 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  tor of values to
8e20: 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
8e30: 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
8e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
8e50: 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20  und up if true. 
8e60: 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66   Round down if f
8e70: 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  alse */.  tRowcn
8e80: 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20  t *aStat        
8e90: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74        /* OUT: st
8ea0: 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ats written here
8eb0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61   */.){.  IndexSa
8ec0: 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
8ed0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
8ee0: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f00: 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65  Index of require
8f10: 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b  d stats in anEq[
8f20: 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  ] etc. */.  int 
8f30: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8f40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8f50: 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65   of first sample
8f60: 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e   >= pRec */.  in
8f70: 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20  t iSample;      
8f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61            /* Sma
8f90: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72  llest sample lar
8fa0: 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ger than or equa
8fb0: 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69  l to pRec */.  i
8fc0: 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20  nt iMin = 0;    
8fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
8fe0: 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f  allest sample no
8ff0: 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a  t yet tested */.
9000: 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20    int iTest;    
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9020: 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20   Next sample to 
9030: 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  test */.  int re
9040: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
9050: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
9060: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  of comparison op
9070: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
9080: 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
9090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
90a0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
90b0: 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  pRec */.  tRowcn
90c0: 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20  t iLower = 0;   
90d0: 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20        /* anLt[] 
90e0: 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67  + anEq[] of larg
90f0: 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20  est sample pRec 
9100: 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  is > */..#ifndef
9110: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9120: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9130: 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64  ( pParse );.#end
9140: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  if.  assert( pRe
9150: 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
9160: 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e  ( pIdx->nSample>
9170: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9180: 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26  Rec->nField>0 &&
9190: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70   pRec->nField<=p
91a0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20  Idx->nSampleCol 
91b0: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69  );..  /* Do a bi
91c0: 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20 66  nary search to f
91d0: 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73 61  ind the first sa
91e0: 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68 61  mple greater tha
91f0: 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20  n or equal.  ** 
9200: 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65 63  to pRec. If pRec
9210: 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
9220: 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65  le field, the se
9230: 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20  t of samples to 
9240: 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73  search.  ** is s
9250: 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c  imply the aSampl
9260: 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68  e[] array. If th
9270: 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  e samples in aSa
9280: 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d  mple[] contain m
9290: 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e  ore.  ** than on
92a0: 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69  e fields, all fi
92b0: 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  elds following t
92c0: 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67 6e  he first are ign
92d0: 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored..  **.  ** 
92e0: 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73  If pRec contains
92f0: 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65   N fields, where
9300: 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20   N is more than 
9310: 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c  one, then as wel
9320: 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61  l as the.  ** sa
9330: 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65  mples in aSample
9340: 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f  [] (truncated to
9350: 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20   N fields), the 
9360: 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20  search also has 
9370: 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  to.  ** consider
9380: 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f   prefixes of tho
9390: 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20  se samples. For 
93a0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
93b0: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20  set of samples. 
93c0: 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69   ** in aSample i
93d0: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
93e0: 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61   aSample[0] = (a
93f0: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  , 5) .  **     a
9400: 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20  Sample[1] = (a, 
9410: 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  10) .  **     aS
9420: 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35  ample[2] = (b, 5
9430: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
9440: 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30  ple[3] = (c, 100
9450: 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
9460: 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35  ple[4] = (c, 105
9470: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ).  **.  ** Then
9480: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
9490: 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79  e should ideally
94a0: 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20   be the samples 
94b0: 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20  above and the . 
94c0: 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69   ** unique prefi
94d0: 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64  xes [a], [b] and
94e0: 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20   [c]. But since 
94f0: 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f 20  that is hard to 
9500: 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20  organize, .  ** 
9510: 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c  the code actuall
9520: 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73 20  y searches this 
9530: 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  set:.  **.  **  
9540: 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20     0: (a) .  ** 
9550: 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20      1: (a, 5) . 
9560: 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31   **     2: (a, 1
9570: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20  0) .  **     3: 
9580: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
9590: 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20    4: (b) .  **  
95a0: 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20     5: (b, 5) .  
95b0: 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20  **     6: (c) . 
95c0: 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31   **     7: (c, 1
95d0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a  00) .  **     8:
95e0: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20   (c, 105).  **  
95f0: 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20     9: (c, 105). 
9600: 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63   **.  ** For eac
9610: 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20  h sample in the 
9620: 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c  aSample[] array,
9630: 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70   N samples are p
9640: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20  resent in the.  
9650: 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  ** effective sam
9660: 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68  ple array. In th
9670: 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73  e above, samples
9680: 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61 73   0 and 1 are bas
9690: 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70  ed on .  ** samp
96a0: 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53  le aSample[0]. S
96b0: 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f  amples 2 and 3 o
96c0: 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63  n aSample[1] etc
96d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65  ..  **.  ** Ofte
96e0: 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65  n, sample i of e
96f0: 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65  ach block of N e
9700: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73  ffective samples
9710: 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64   has (i+1) field
9720: 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  s..  ** Except, 
9730: 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20  each sample may 
9740: 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65  be extended to e
9750: 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69 73  nsure that it is
9760: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
9770: 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  .  ** equal to t
9780: 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70  he previous samp
9790: 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  le in the array.
97a0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e   For example, in
97b0: 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a   the above, .  *
97c0: 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68  * sample 2 is th
97d0: 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f  e first sample o
97e0: 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73  f a block of N s
97f0: 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69  amples, so at fi
9800: 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70  rst it .  ** app
9810: 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68 6f  ears that it sho
9820: 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20 69  uld be 1 field i
9830: 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c  n size. However,
9840: 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65   that would make
9850: 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65   it .  ** smalle
9860: 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c  r than sample 1,
9870: 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   so the binary s
9880: 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20  earch would not 
9890: 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c  work. As a resul
98a0: 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  t, .  ** it is e
98b0: 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66  xtended to two f
98c0: 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69  ields. The dupli
98d0: 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73 20  cates that this 
98e0: 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a  creates do not .
98f0: 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70    ** cause any p
9900: 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
9910: 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e  nField = pRec->n
9920: 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20  Field;.  iCol = 
9930: 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70  0;.  iSample = p
9940: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e  Idx->nSample * n
9950: 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20  Field;.  do{.   
9960: 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20   int iSamp;     
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9980: 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70  * Index in aSamp
9990: 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d  le[] of test sam
99a0: 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ple */.    int n
99b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
99c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
99d0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
99e0: 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a  test sample */..
99f0: 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69      iTest = (iMi
9a00: 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20  n+iSample)/2;.  
9a10: 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20    iSamp = iTest 
9a20: 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66  / nField;.    if
9a30: 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20  ( iSamp>0 ){.   
9a40: 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73     /* The propos
9a50: 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  ed effective sam
9a60: 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78 20  ple is a prefix 
9a70: 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c  of sample aSampl
9a80: 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20  e[iSamp]..      
9a90: 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  ** Specifically,
9aa0: 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70 72   the shortest pr
9ab0: 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74  efix of at least
9ac0: 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65   (1 + iTest%nFie
9ad0: 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ld) .      ** fi
9ae0: 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72 65  elds that is gre
9af0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70 72  ater than the pr
9b00: 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76 65  evious effective
9b10: 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20   sample.  */.   
9b20: 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20     for(n=(iTest 
9b30: 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e  % nField) + 1; n
9b40: 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20  <nField; n++){. 
9b50: 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
9b60: 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74  le[iSamp-1].anLt
9b70: 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69  [n-1]!=aSample[i
9b80: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
9b90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
9ba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9bb0: 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b    n = iTest + 1;
9bc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63  .    }..    pRec
9bd0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20  ->nField = n;.  
9be0: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
9bf0: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
9c00: 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e  (aSample[iSamp].
9c10: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  n, aSample[iSamp
9c20: 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20  ].p, pRec);.    
9c30: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
9c40: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
9c50: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9c60: 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69  n-1] + aSample[i
9c70: 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b  Samp].anEq[n-1];
9c80: 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
9c90: 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
9ca0: 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e   if( res==0 && n
9cb0: 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20  <nField ){.     
9cc0: 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
9cd0: 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
9ce0: 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d  1];.      iMin =
9cf0: 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20   iTest+1;.      
9d00: 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  res = -1;.    }e
9d10: 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70  lse{.      iSamp
9d20: 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20  le = iTest;.    
9d30: 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20    iCol = n-1;.  
9d40: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65    }.  }while( re
9d50: 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c  s && iMin<iSampl
9d60: 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70  e );.  i = iSamp
9d70: 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69  le / nField;..#i
9d80: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9d90: 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  G.  /* The follo
9da0: 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
9db0: 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61  ements check tha
9dc0: 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  t the binary sea
9dd0: 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62  rch code.  ** ab
9de0: 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69  ove found the ri
9df0: 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73  ght answer. This
9e00: 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f   block serves no
9e10: 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20   purpose other. 
9e20: 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f   ** than to invo
9e30: 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20  ke the asserts. 
9e40: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
9e50: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9e60: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ed==0 ){.    if(
9e70: 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
9e80: 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20   /* If (res==0) 
9e90: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52  is true, then pR
9ea0: 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  ec must be equal
9eb0: 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f   to sample i. */
9ec0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
9ed0: 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
9ee0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ef0: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
9f00: 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46  ;.      pRec->nF
9f10: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
9f20: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
9f30: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9f40: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9f50: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9f60: 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20  ].p, pRec) .    
9f70: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
9f80: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9f90: 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ed .      );.   
9fa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
9fb0: 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d   Unless i==pIdx-
9fc0: 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61  >nSample, indica
9fd0: 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20 69  ting that pRec i
9fe0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20  s larger than.  
9ff0: 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c      ** all sampl
a000: 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  es in the aSampl
a010: 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20  e[] array, pRec 
a020: 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
a030: 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  than the.      *
a040: 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  * (iCol+1) field
a050: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
a060: 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  e i.  */.      a
a070: 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e  ssert( i<=pIdx->
a080: 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20  nSample && i>=0 
a090: 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
a0a0: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a  Field = iCol+1;.
a0b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
a0c0: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a  =pIdx->nSample .
a0d0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
a0e0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a0f0: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a100: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
a110: 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20  p, pRec)>0.     
a120: 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
a130: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
a140: 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69  d );..      /* i
a150: 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d  f i==0 and iCol=
a160: 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  =0, then record 
a170: 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20  pRec is smaller 
a180: 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  than all samples
a190: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
a1a0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
a1b0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
a1c0: 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52  (iCol>0) then pR
a1d0: 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  ec must.      **
a1e0: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
a1f0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
a200: 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72   (iCol) field pr
a210: 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69  efix of sample i
a220: 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69  ..      ** If (i
a230: 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d  >0), then pRec m
a240: 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61  ust also be grea
a250: 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ter than sample 
a260: 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20  (i-1).  */.     
a270: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
a280: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
a290: 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  eld = iCol;.    
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a2b0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
a2c0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
a2d0: 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
a2e0: 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20   pRec)<=0.      
a2f0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
a300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a310: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
a320: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
a330: 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
a340: 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20  eld = nField;.  
a350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a360: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a370: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a380: 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  -1].n, aSample[i
a390: 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20  -1].p, pRec)<0. 
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a3b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
a3c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
a3d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
a3e0: 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
a3f0: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20  ITE_DEBUG */..  
a400: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
a410: 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63    /* Record pRec
a420: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d   is equal to sam
a430: 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73  ple i */.    ass
a440: 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c  ert( iCol==nFiel
a450: 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74  d-1 );.    aStat
a460: 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
a470: 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
a480: 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d   aStat[1] = aSam
a490: 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c  ple[i].anEq[iCol
a4a0: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
a4b0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
a4c0: 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66  , the (iCol+1) f
a4d0: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61  ield prefix of a
a4e0: 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
a4f0: 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73   first .    ** s
a500: 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
a510: 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e  eater than pRec.
a520: 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d   Or, if i==pIdx-
a530: 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52  >nSample then pR
a540: 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72  ec.    ** is lar
a550: 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ger than all sam
a560: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72 61  ples in the arra
a570: 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e  y. */.    tRowcn
a580: 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  t iUpper, iGap;.
a590: 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d      if( i>=pIdx-
a5a0: 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  >nSample ){.    
a5b0: 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74    iUpper = sqlit
a5c0: 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49  e3LogEstToInt(pI
a5d0: 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
a5e0: 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0]);.    }else{.
a5f0: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
a600: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
a610: 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Col];.    }..   
a620: 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70   if( iLower>=iUp
a630: 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61  per ){.      iGa
a640: 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
a650: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
a660: 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a  Upper - iLower;.
a670: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f      }.    if( ro
a680: 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69  undUp ){.      i
a690: 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33  Gap = (iGap*2)/3
a6a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a6b0: 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33     iGap = iGap/3
a6c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
a6d0: 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20  t[0] = iLower + 
a6e0: 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b  iGap;.    aStat[
a6f0: 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45  1] = pIdx->aAvgE
a700: 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20  q[iCol];.  }..  
a710: 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 70  /* Restore the p
a720: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75  Rec->nField valu
a730: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
a740: 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e  ng.  */.  pRec->
a750: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
a760: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23  .  return i;.}.#
a770: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a780: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
a790: 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
a7a0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
a7b0: 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
a7c0: 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
a7d0: 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
a7e0: 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
a7f0: 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
a800: 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
a810: 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
a820: 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
a830: 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
a840: 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
a850: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
a860: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
a870: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
a880: 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
a890: 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
a8a0: 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
a8b0: 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
a8c0: 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
a8d0: 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
a8e0: 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
a8f0: 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
a900: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
a910: 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
a920: 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
a930: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
a940: 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
a950: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
a960: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
a970: 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
a980: 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
a990: 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
a9a0: 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
a9b0: 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
a9c0: 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
a9d0: 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
a9e0: 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
a9f0: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
aa00: 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
aa10: 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
aa20: 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
aa30: 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
aa40: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
aa50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
aa60: 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
aa70: 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
aa80: 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
aa90: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
aaa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
aab0: 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
aac0: 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
aad0: 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
aae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
aaf0: 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69  urn nRet;.}...#i
ab00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ab10: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
ab20: 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  4./*.** Return t
ab30: 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20  he affinity for 
ab40: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
ab50: 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  of an index..*/.
ab60: 63 68 61 72 20 73 71 6c 69 74 65 33 49 6e 64 65  char sqlite3Inde
ab70: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
ab80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
ab90: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 69 43  ex *pIdx, int iC
aba0: 6f 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ol){.  assert( i
abb0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
abc0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  Idx->nColumn );.
abd0: 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f    if( !pIdx->zCo
abe0: 6c 41 66 66 20 29 7b 0a 20 20 20 20 69 66 28 20  lAff ){.    if( 
abf0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
ac00: 6e 69 74 79 53 74 72 28 64 62 2c 20 70 49 64 78  nityStr(db, pIdx
ac10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
ac20: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
ac30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78   }.  return pIdx
ac40: 2d 3e 7a 43 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b  ->zColAff[iCol];
ac50: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64  .}.#endif...#ifd
ac60: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ac70: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
ac80: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
ac90: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
aca0: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
acb0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69  umber of rows vi
acc0: 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72 61  sited by a.** ra
acd0: 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73 6b  nge-scan on a sk
ace0: 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20 46  ip-scan index. F
acf0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
ad00: 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
ad10: 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c 20   i1 ON t1(a, b, 
ad20: 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  c);.**   SELECT 
ad30: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
ad40: 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45 45  a=? AND c BETWEE
ad50: 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a  N ? AND ?;.**.**
ad60: 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f   Value pLoop->nO
ad70: 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ut is currently 
ad80: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
ad90: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
ada0: 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  ows .** visited 
adb0: 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61 3d  for scanning (a=
adc0: 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69 73  ? AND b=?). This
add0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63 65   function reduce
ade0: 73 20 74 68 61 74 20 65 73 74 69 6d 61 74 65 20  s that estimate 
adf0: 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63 74  .** by some fact
ae00: 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  or to account fo
ae10: 72 20 74 68 65 20 28 63 20 42 45 54 57 45 45 4e  r the (c BETWEEN
ae20: 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65 73   ? AND ?) expres
ae30: 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f 6e  sion based.** on
ae40: 20 74 68 65 20 73 74 61 74 34 20 64 61 74 61 20   the stat4 data 
ae50: 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20 74  for the index. t
ae60: 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62 65  his scan will be
ae70: 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69 70   peformed multip
ae80: 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f 6e  le .** times (on
ae90: 63 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c 62  ce for each (a,b
aea0: 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68  ) combination th
aeb0: 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29 20  at matches a=?) 
aec0: 69 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a 2a  is dealt with .*
aed0: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
aee0: 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20 74  .**.** It does t
aef0: 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  his by scanning 
af00: 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61 74  through all stat
af10: 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70 61  4 samples, compa
af20: 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20 65  ring values.** e
af30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
af40: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
af50: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70  with the corresp
af60: 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e  onding column in
af70: 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e   each.** sample.
af80: 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65 20   If L and U are 
af90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
afa0: 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20 62  mples found to b
afb0: 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a  e less than or.*
afc0: 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76  * equal to the v
afd0: 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20  alues extracted 
afe0: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20  from pLower and 
aff0: 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
b000: 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69 73  ely, and.** N is
b010: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
b020: 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74 68  r of samples, th
b030: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61  e pLoop->nOut va
b040: 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65 64 0a  lue is adjusted.
b050: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
b060: 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e 4f  *.**   nOut = nO
b070: 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20 4c  ut * ( min(U - L
b080: 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a  , 1) / N ).**.**
b090: 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55   If pLower is NU
b0a0: 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63  LL, or a value c
b0b0: 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74  annot be extract
b0c0: 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72 6d  ed from the term
b0d0: 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  , L is.** set to
b0e0: 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65 72   zero. If pUpper
b0f0: 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76   is NULL, or a v
b100: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65  alue cannot be e
b110: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
b120: 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74 6f  ,.** U is set to
b130: 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c   N..**.** Normal
b140: 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
b150: 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20 74  n sets *pbDone t
b160: 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72  o 1 before retur
b170: 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a  ning. However,.*
b180: 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63 61  * if no value ca
b190: 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  n be extracted f
b1a0: 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77 65  rom either pLowe
b1b0: 72 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e 64  r or pUpper (and
b1c0: 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69 6d   so the.** estim
b1d0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
b1e0: 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76 65  r of rows delive
b1f0: 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  red remains unch
b200: 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65 0a  anged), *pbDone.
b210: 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69 73  ** is left as is
b220: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
b230: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
b240: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
b250: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
b260: 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51 4c  herwise, .** SQL
b270: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
b280: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
b290: 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20 50  SkipScanEst(.  P
b2a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b2b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
b2c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
b2d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
b2e0: 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
b2f0: 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
b300: 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
b310: 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
b320: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
b330: 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
b340: 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
b350: 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
b360: 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
b370: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
b380: 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
b390: 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ,    /* Update t
b3a0: 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20 6f  he .nOut value o
b3b0: 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  f this loop */. 
b3c0: 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20 20   int *pbDone    
b3d0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
b3e0: 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74  true if at least
b3f0: 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75 65   one expr. value
b400: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29 7b   extracted */.){
b410: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c  .  Index *p = pL
b420: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
b430: 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  dex;.  int nEq =
b440: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
b450: 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nEq;.  sqlite3 *
b460: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b470: 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d 20  .  int nLower = 
b480: 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65 72  -1;.  int nUpper
b490: 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b   = p->nSample+1;
b4a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b4b0: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 66 66 20  TE_OK;.  u8 aff 
b4c0: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f  = sqlite3IndexCo
b4d0: 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 64 62 2c  lumnAffinity(db,
b4e0: 20 70 2c 20 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c   p, nEq);.  Coll
b4f0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20  Seq *pColl;.  . 
b500: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b510: 70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p1 = 0;         
b520: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b530: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
b540: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b550: 75 65 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20  ue *p2 = 0;     
b560: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
b570: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70  tracted from pUp
b580: 70 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  per */.  sqlite3
b590: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
b5a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ;        /* Valu
b5b0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
b5c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43   record */..  pC
b5d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
b5e0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
b5f0: 65 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71  e, p->azColl[nEq
b600: 5d 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  ]);.  if( pLower
b610: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b620: 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
b630: 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
b640: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
b650: 69 67 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b  ight, aff, &p1);
b660: 0a 20 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b  .    nLower = 0;
b670: 0a 20 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65  .  }.  if( pUppe
b680: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
b690: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
b6a0: 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75 65  qlite3Stat4Value
b6b0: 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
b6c0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
b6d0: 70 52 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32  pRight, aff, &p2
b6e0: 29 3b 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20  );.    nUpper = 
b6f0: 70 32 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d  p2 ? 0 : p->nSam
b700: 70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ple;.  }..  if( 
b710: 70 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20  p1 || p2 ){.    
b720: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
b730: 44 69 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Diff;.    for(i=
b740: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
b750: 20 26 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65   && i<p->nSample
b760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
b770: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 43   = sqlite3Stat4C
b780: 6f 6c 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61  olumn(db, p->aSa
b790: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53  mple[i].p, p->aS
b7a0: 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c  ample[i].n, nEq,
b7b0: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &pVal);.      i
b7c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b7d0: 20 26 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20   && p1 ){.      
b7e0: 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69    int res = sqli
b7f0: 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31  te3MemCompare(p1
b800: 2c 20 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a  , pVal, pColl);.
b810: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
b820: 3d 30 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20  =0 ) nLower++;. 
b830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b840: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b850: 26 20 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20  & p2 ){.        
b860: 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
b870: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20  3MemCompare(p2, 
b880: 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
b890: 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
b8a0: 20 29 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20   ) nUpper++;.   
b8b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
b8c0: 44 69 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d  Diff = (nUpper -
b8d0: 20 6e 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66   nLower);.    if
b8e0: 28 20 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69  ( nDiff<=0 ) nDi
b8f0: 66 66 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ff = 1;..    /* 
b900: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
b910: 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   an upper and lo
b920: 77 65 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66  wer bound specif
b930: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20  ied, and the .  
b940: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73    ** comparisons
b950: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
b960: 68 65 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f  hey are close to
b970: 67 65 74 68 65 72 2c 20 75 73 65 20 74 68 65 20  gether, use the 
b980: 66 61 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  fallback.    ** 
b990: 6d 65 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74  method (assume t
b9a0: 68 61 74 20 74 68 65 20 73 63 61 6e 20 76 69 73  hat the scan vis
b9b0: 69 74 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20  its 1/64 of the 
b9c0: 72 6f 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61  rows) for estima
b9d0: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
b9e0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
b9f0: 69 73 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73  isited. Otherwis
ba00: 65 2c 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  e, estimate the 
ba10: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
ba20: 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20     ** using the 
ba30: 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
ba40: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 63   in the header c
ba50: 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20  omment for this 
ba60: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
ba70: 20 69 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c   if( nDiff!=1 ||
ba80: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c   pUpper==0 || pL
ba90: 6f 77 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ower==0 ){.     
baa0: 20 69 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28   int nAdjust = (
bab0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d  sqlite3LogEst(p-
bac0: 3e 6e 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69  >nSample) - sqli
bad0: 74 65 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29  te3LogEst(nDiff)
bae0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  );.      pLoop->
baf0: 6e 4f 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b  nOut -= nAdjust;
bb00: 0a 20 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d  .      *pbDone =
bb10: 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54   1;.      WHERET
bb20: 52 41 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e  RACE(0x10, ("ran
bb30: 67 65 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67  ge skip-scan reg
bb40: 69 6f 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64  ions: %u..%u  ad
bb50: 6a 75 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e  just=%d est=%d\n
bb60: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
bb80: 6f 77 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41  ower, nUpper, nA
bb90: 64 6a 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d  djust*-1, pLoop-
bba0: 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a  >nOut));.    }..
bbb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
bbc0: 65 72 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20  ert( *pbDone==0 
bbd0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
bbe0: 33 56 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a  3ValueFree(p1);.
bbf0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
bc00: 65 65 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p2);.  sqlite
bc10: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
bc20: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
bc30: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bc40: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
bc50: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
bc60: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
bc70: 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
bc80: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
bc90: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
bca0: 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
bcb0: 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
bcc0: 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
bcd0: 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
bce0: 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
bcf0: 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
bd00: 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
bd10: 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
bd20: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
bd30: 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
bd40: 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
bd50: 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
bd60: 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
bd70: 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
bd80: 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
bd90: 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
bda0: 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
bdb0: 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
bdc0: 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
bdd0: 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
bde0: 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
be10: 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
be30: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
be60: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
be70: 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
be80: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
be90: 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
bea0: 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
beb0: 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
bec0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
bed0: 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
bee0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
bef0: 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
bf00: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
bf10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
bf20: 68 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75  he index.** colu
bf30: 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
bf40: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
bf50: 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
bf60: 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
bf70: 20 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20   of.** equality 
bf80: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69  constraints opti
bf90: 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
bfa0: 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
bfb0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
bfc0: 2a 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  * assuming index
bfd0: 20 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62   p is on t1(a, b
bfe0: 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
bff0: 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
c000: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
c010: 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
c020: 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
c030: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
c040: 69 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20  is set to 1 (as 
c050: 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
c060: 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20  cted column, b, 
c070: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  is the second .*
c080: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  * left-most colu
c090: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
c0a0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
c0b0: 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
c0c0: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
c0d0: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
c0e0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
c0f0: 6e 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e  nEq is set to 0.
c100: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
c110: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
c120: 6c 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73  led, *pnOut is s
c130: 65 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  et to the sqlite
c140: 33 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65  3LogEst() of the
c150: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
c160: 77 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ws that the inde
c170: 78 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74  x scan is expect
c180: 65 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68  ed to visit with
c190: 6f 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  out .** consider
c1a0: 69 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f  ing the range co
c1b0: 6e 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45  nstraints. If nE
c1c0: 71 20 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e  q is 0, then *pn
c1d0: 4f 75 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Out is the numbe
c1e0: 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
c1f0: 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
c200: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
c210: 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
c220: 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
c230: 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
c240: 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
c250: 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65  onstraints pLowe
c260: 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a  r and pUpper..**
c270: 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65   .** In the abse
c280: 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
c290: 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at4 ANALYZE data
c2a0: 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74  , or if such dat
c2b0: 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  a cannot be.** u
c2c0: 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61  sed, a single ra
c2d0: 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  nge inequality r
c2e0: 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
c2f0: 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
c300: 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e  tor of 4. .** an
c310: 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  d a pair of cons
c320: 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
c330: 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
c340: 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
c350: 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
c360: 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
c370: 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69   of 64..*/.stati
c380: 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
c390: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
c3a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c3b0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
c3c0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
c3d0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
c3e0: 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
c3f0: 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
c400: 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
c410: 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
c420: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
c430: 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
c440: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
c450: 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
c460: 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
c470: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
c480: 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
c490: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
c4a0: 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f  oop *pLoop     /
c4b0: 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f  * Modify the .nO
c4c0: 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52  ut and maybe .rR
c4d0: 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  un fields */.){.
c4e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c4f0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
c500: 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a   = pLoop->nOut;.
c510: 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a    LogEst nNew;..
c520: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c530: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
c540: 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
c550: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
c560: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
c570: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
c580: 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70  ee.nEq;..  if( p
c590: 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e  ->nSample>0 && n
c5a0: 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  Eq<p->nSampleCol
c5b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d   ){.    if( nEq=
c5c0: 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56  =pBuilder->nRecV
c5d0: 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e  alid ){.      Un
c5e0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
c5f0: 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ec = pBuilder->p
c600: 52 65 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63  Rec;.      tRowc
c610: 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 69  nt a[2];.      i
c620: 6e 74 20 6e 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d  nt nBtm = pLoop-
c630: 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20  >u.btree.nBtm;. 
c640: 20 20 20 20 20 69 6e 74 20 6e 54 6f 70 20 3d 20       int nTop = 
c650: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
c660: 54 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56  Top;..      /* V
c670: 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77  ariable iLower w
c680: 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68  ill be set to th
c690: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
c6a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
c6b0: 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   in .      ** th
c6c0: 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
c6d0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
c6e0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
c6f0: 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54  e range query. T
c700: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65  he.      ** lowe
c710: 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
c720: 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
c730: 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
c740: 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
c750: 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69      ** key-prefi
c760: 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  x formed by the 
c770: 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68  nEq values match
c780: 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e  ed against the n
c790: 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20  Eq left-most.   
c7a0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66     ** columns of
c7b0: 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
c7c0: 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  $L is the value 
c7d0: 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20  in pLower..     
c7e0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c   **.      ** Or,
c7f0: 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55   if pLower is NU
c800: 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20  LL or $L cannot 
c810: 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
c820: 6d 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74  m it (because it
c830: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
c840: 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62   a simple variab
c850: 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61  le or literal va
c860: 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20  lue), the lower 
c870: 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  bound of the.   
c880: 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24     ** range is $
c890: 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72  P. Due to a quir
c8a0: 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65  k in the way whe
c8b0: 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72  reKeyStats() wor
c8c0: 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a  ks, even.      *
c8d0: 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c  * if $L is avail
c8e0: 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74  able, whereKeySt
c8f0: 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ats() is called 
c900: 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e  for both ($P) an
c910: 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a  d .      ** ($P:
c920: 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
c930: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
c940: 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73  turned values is
c950: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a   used..      **.
c960: 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72        ** Similar
c970: 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f  ly, iUpper is to
c980: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
c990: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
c9a0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
c9b0: 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e      ** less than
c9c0: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
c9d0: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75   of the range qu
c9e0: 65 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75  ery. Where the u
c9f0: 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20  pper bound.     
ca00: 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24   ** is either ($
ca10: 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41  P) or ($P:$U). A
ca20: 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55  gain, even if $U
ca30: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62   is available, b
ca40: 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20  oth values.     
ca50: 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72   ** of iUpper ar
ca60: 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77  e requested of w
ca70: 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61  hereKeyStats() a
ca80: 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75  nd the smaller u
ca90: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sed..      **.  
caa0: 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65      ** The numbe
cab0: 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65  r of rows betwee
cac0: 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73  n the two bounds
cad0: 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55   is then just iU
cae0: 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20  pper-iLower..   
caf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77     */.      tRow
cb00: 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20  cnt iLower;     
cb10: 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61  /* Rows less tha
cb20: 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
cb30: 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63  d */.      tRowc
cb40: 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f  nt iUpper;     /
cb50: 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
cb60: 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
cb70: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   */.      int iL
cb80: 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a  wrIdx = -2;   /*
cb90: 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74   aSample[] for t
cba0: 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a  he lower bound *
cbb0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72  /.      int iUpr
cbc0: 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61  Idx = -1;   /* a
cbd0: 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65  Sample[] for the
cbe0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
cbf0: 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20  .      if( pRec 
cc00: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
cc10: 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ase( pRec->nFiel
cc20: 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  d!=pBuilder->nRe
cc30: 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  cValid );.      
cc40: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
cc50: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
cc60: 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alid;.      }.  
cc70: 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
cc80: 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70   iLower and iUpp
cc90: 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e  er using ($P) on
cca0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
ccb0: 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20   nEq==0 ){.     
ccc0: 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
ccd0: 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
cce0: 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20  p->nRowEst0;.   
ccf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cd00: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
cd10: 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70  call could be op
cd20: 74 69 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73  timized away - s
cd30: 69 6e 63 65 20 74 68 65 20 73 61 6d 65 20 76 61  ince the same va
cd40: 6c 75 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20  lues must .     
cd50: 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
cd60: 72 65 71 75 65 73 74 65 64 20 77 68 65 6e 20 74  requested when t
cd70: 65 73 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e  esting key $P in
cd80: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
cd90: 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  st().  */.      
cda0: 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
cdb0: 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
cdc0: 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   0, a);.        
cdd0: 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iLower = a[0];. 
cde0: 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
cdf0: 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20  a[0] + a[1];.   
ce00: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
ce10: 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c  rt( pLower==0 ||
ce20: 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61   (pLower->eOpera
ce30: 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
ce40: 47 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  GE))!=0 );.     
ce50: 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d   assert( pUpper=
ce60: 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65  =0 || (pUpper->e
ce70: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
ce80: 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a  T|WO_LE))!=0 );.
ce90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cea0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
ceb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
cec0: 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29  SortOrder[nEq] )
ced0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
cee0: 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72   roles of pLower
cef0: 20 61 6e 64 20 70 55 70 70 65 72 20 61 72 65 20   and pUpper are 
cf00: 73 77 61 70 70 65 64 20 66 6f 72 20 61 20 44 45  swapped for a DE
cf10: 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  SC index */.    
cf20: 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
cf30: 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70  rm*, pLower, pUp
cf40: 70 65 72 29 3b 0a 20 20 20 20 20 20 20 20 53 57  per);.        SW
cf50: 41 50 28 69 6e 74 2c 20 6e 42 74 6d 2c 20 6e 54  AP(int, nBtm, nT
cf60: 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  op);.      }..  
cf70: 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62      /* If possib
cf80: 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74  le, improve on t
cf90: 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61  he iLower estima
cfa0: 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29  te using ($P:$L)
cfb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
cfc0: 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
cfd0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
cfe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
cff0: 6c 75 65 73 20 65 78 74 72 61 63 74 65 64 20 66  lues extracted f
d000: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
d010: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
d020: 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
d030: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
d040: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
d050: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
d060: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
d070: 63 2c 20 70 45 78 70 72 2c 20 6e 42 74 6d 2c 20  c, pExpr, nBtm, 
d080: 6e 45 71 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  nEq, &n);.      
d090: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d0a0: 5f 4f 4b 20 26 26 20 6e 20 29 7b 0a 20 20 20 20  _OK && n ){.    
d0b0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e        tRowcnt iN
d0c0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 75 31  ew;.          u1
d0d0: 36 20 6d 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57  6 mask = WO_GT|W
d0e0: 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20  O_LE;.          
d0f0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 56  if( sqlite3ExprV
d100: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
d110: 3e 6e 20 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f  >n ) mask = (WO_
d120: 4c 45 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20  LE|WO_LT);.     
d130: 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77       iLwrIdx = w
d140: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
d150: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
d160: 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
d170: 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
d180: 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
d190: 20 26 20 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20   & mask) ? a[1] 
d1a0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
d1b0: 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20  if( iNew>iLower 
d1c0: 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b  ) iLower = iNew;
d1d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  .          nOut-
d1e0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f  -;.          pLo
d1f0: 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wer = 0;.       
d200: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
d210: 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
d220: 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
d230: 20 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65   iUpper estimate
d240: 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20   using ($P:$U). 
d250: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55 70  */.      if( pUp
d260: 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  per ){.        i
d270: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
d280: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
d290: 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
d2a0: 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
d2b0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
d2c0: 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
d2d0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
d2e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
d2f0: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70  4ProbeSetValue(p
d300: 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c  Parse, p, &pRec,
d310: 20 70 45 78 70 72 2c 20 6e 54 6f 70 2c 20 6e 45   pExpr, nTop, nE
d320: 71 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  q, &n);.        
d330: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d340: 4b 20 26 26 20 6e 20 29 7b 0a 20 20 20 20 20 20  K && n ){.      
d350: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
d360: 3b 0a 20 20 20 20 20 20 20 20 20 20 75 31 36 20  ;.          u16 
d370: 6d 61 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f  mask = WO_GT|WO_
d380: 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  LE;.          if
d390: 28 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  ( sqlite3ExprVec
d3a0: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 6e  torSize(pExpr)>n
d3b0: 20 29 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45   ) mask = (WO_LE
d3c0: 7c 57 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20  |WO_LT);.       
d3d0: 20 20 20 69 55 70 72 49 64 78 20 3d 20 77 68 65     iUprIdx = whe
d3e0: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
d3f0: 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61  e, p, pRec, 1, a
d400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65  );.          iNe
d410: 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70  w = a[0] + ((pUp
d420: 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  per->eOperator &
d430: 20 6d 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20   mask) ? a[1] : 
d440: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
d450: 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29 20  ( iNew<iUpper ) 
d460: 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20  iUpper = iNew;. 
d470: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b           nOut--;
d480: 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 70 65  .          pUppe
d490: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  r = 0;.        }
d4a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d4b0: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
d4c0: 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66 28   pRec;.      if(
d4d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d4e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 55  {.        if( iU
d4f0: 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20  pper>iLower ){. 
d500: 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20           nNew = 
d510: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69 55  sqlite3LogEst(iU
d520: 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a  pper - iLower);.
d530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
d540: 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69 55  ING:  If both iU
d550: 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72 20  pper and iLower 
d560: 61 72 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d  are derived from
d570: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
d580: 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74      ** sample, t
d590: 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79 20  hen assume they 
d5a0: 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c 65  are 4x more sele
d5b0: 63 74 69 76 65 2e 20 20 54 68 69 73 20 62 72 69  ctive.  This bri
d5c0: 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ngs.          **
d5d0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 73   the estimated s
d5e0: 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65 20  electivity more 
d5f0: 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68 61  in line with wha
d600: 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20 20  t it would be.  
d610: 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65 73          ** if es
d620: 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74 20  timated without 
d630: 74 68 65 20 75 73 65 20 6f 66 20 53 54 41 54 33  the use of STAT3
d640: 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  /4 tables. */.  
d650: 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 77 72          if( iLwr
d660: 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20 6e  Idx==iUprIdx ) n
d670: 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73 65  New -= 20;  asse
d680: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
d690: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
d6a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d6b0: 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20       nNew = 10; 
d6c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
d6d0: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
d6e0: 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (2) );.        }
d6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e 65  .        if( nNe
d700: 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  w<nOut ){.      
d710: 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b      nOut = nNew;
d720: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d730: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
d740: 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e 67  10, ("STAT4 rang
d750: 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20  e scan: %u..%u  
d760: 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65        (u32)iLowe
d790: 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20  r, (u32)iUpper, 
d7a0: 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  nOut));.      }.
d7b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d7c0: 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
d7d0: 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
d7e0: 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74  RangeSkipScanEst
d7f0: 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c  (pParse, pLower,
d800: 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20   pUpper, pLoop, 
d810: 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  &bDone);.      i
d820: 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75 72  f( bDone ) retur
d830: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
d840: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
d850: 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
d860: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
d870: 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b 0a  ETER(pBuilder);.
d880: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
d890: 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23 65   || pUpper );.#e
d8a0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
d8b0: 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70  Upper==0 || (pUp
d8c0: 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  per->wtFlags & T
d8d0: 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
d8e0: 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52  .  nNew = whereR
d8f0: 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77 65  angeAdjust(pLowe
d900: 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77  r, nOut);.  nNew
d910: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
d920: 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65 77  ust(pUpper, nNew
d930: 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  );..  /* TUNING:
d940: 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
d950: 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20 6c  h an upper and l
d960: 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e  ower limit and n
d970: 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a  either limit.  *
d980: 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63 61  * has an applica
d990: 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b  tion-defined lik
d9a0: 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d  elihood(), assum
d9b0: 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a 20  e the range is. 
d9c0: 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20 61   ** reduced by a
d9d0: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35 25  n additional 75%
d9e0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
d9f0: 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 61  t, by default, a
da00: 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a  n open-ended.  *
da10: 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28 65  * range query (e
da20: 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20  .g. col > ?) is 
da30: 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63 68  assumed to match
da40: 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77 73   1/4 of the rows
da50: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
da60: 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f 73  ex. While a clos
da70: 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20 63  ed range (e.g. c
da80: 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  ol BETWEEN ? AND
da90: 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65 64   ?) is estimated
daa0: 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31   to.  ** match 1
dab0: 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65 78  /64 of the index
dac0: 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77  . */ .  if( pLow
dad0: 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72  er && pLower->tr
dae0: 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55 70  uthProb>0 && pUp
daf0: 70 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e 74  per && pUpper->t
db00: 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20  ruthProb>0 ){.  
db10: 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20    nNew -= 20;.  
db20: 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c  }..  nOut -= (pL
db30: 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70 70  ower!=0) + (pUpp
db40: 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e  er!=0);.  if( nN
db50: 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20 31  ew<10 ) nNew = 1
db60: 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f  0;.  if( nNew<nO
db70: 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77  ut ) nOut = nNew
db80: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  ;.#if defined(WH
db90: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
dba0: 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  ).  if( pLoop->n
dbb0: 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  Out>nOut ){.    
dbc0: 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
dbd0: 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77  ("Range scan low
dbe0: 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64  ers nOut from %d
dbf0: 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   to %d\n",.     
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
dc10: 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74  Loop->nOut, nOut
dc20: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
dc30: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
dc40: 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72  LogEst)nOut;.  r
dc50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
dc60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
dc70: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
dc80: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
dc90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
dca0: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
dcb0: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
dcc0: 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79  n.** an equality
dcd0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41   constraint x=VA
dce0: 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68  LUE and where th
dcf0: 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20  at VALUE occurs 
dd00: 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67  in.** the histog
dd10: 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20  ram data.  This 
dd20: 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20  only works when 
dd30: 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  x is the left-mo
dd40: 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  st.** column of 
dd50: 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c  an index and sql
dd60: 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67  ite_stat3 histog
dd70: 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69  ram data is avai
dd80: 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61  lable.** for tha
dd90: 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70  t index.  When p
dda0: 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Expr==NULL that 
ddb0: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72  means the constr
ddc0: 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53  aint is.** "x IS
ddd0: 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f   NULL" instead o
dde0: 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a  f "x=VALUE"..**.
ddf0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
de00: 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
de10: 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
de20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
de30: 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
de40: 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
de50: 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
de60: 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
de70: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
de80: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
de90: 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
dea0: 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
deb0: 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
dec0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
ded0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
dee0: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
def0: 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
df00: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
df10: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
df20: 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
df30: 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
df40: 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
df50: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
df60: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
df70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
df80: 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
df90: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
dfa0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
dfb0: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
dfc0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
dfd0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
dfe0: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
dff0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
e000: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
e010: 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20  ssion for VALUE 
e020: 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63  in the x=VALUE c
e030: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74  onstraint */.  t
e040: 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
e050: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e060: 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
e070: 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
e080: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
e090: 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
e0a0: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
e0b0: 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64  int nEq = pBuild
e0c0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
e0d0: 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65  e.nEq;.  Unpacke
e0e0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
e0f0: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
e100: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
e110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e120: 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
e130: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
e140: 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
e150: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
e160: 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b  ics */.  int bOk
e170: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  ;..  assert( nEq
e180: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
e190: 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq<=p->nColumn
e1a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
e1b0: 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
e1c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d   assert( p->nSam
e1d0: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
e1e0: 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  t( pBuilder->nRe
e1f0: 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20  cValid<nEq );.. 
e200: 20 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72   /* If values ar
e210: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
e220: 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  for all fields o
e230: 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74  f the index to t
e240: 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
e250: 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74  this one, no est
e260: 69 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64  imate can be mad
e270: 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
e280: 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20  _NOTFOUND. */.  
e290: 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  if( pBuilder->nR
e2a0: 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20  ecValid<(nEq-1) 
e2b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e2c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
e2d0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73   }..  /* This is
e2e0: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
e2f0: 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20   only. The call 
e300: 74 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50  to sqlite3Stat4P
e310: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20  robeSetValue(). 
e320: 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20   ** below would 
e330: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
e340: 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28  value.  */.  if(
e350: 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e   nEq>=p->nColumn
e360: 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d   ){.    *pnRow =
e370: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
e380: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
e390: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
e3a0: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
e3b0: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
e3c0: 2c 20 70 45 78 70 72 2c 20 31 2c 20 6e 45 71 2d  , pExpr, 1, nEq-
e3d0: 31 2c 20 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69  1, &bOk);.  pBui
e3e0: 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
e3f0: 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  c;.  if( rc!=SQL
e400: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
e410: 72 63 3b 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30  rc;.  if( bOk==0
e420: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e430: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75  _NOTFOUND;.  pBu
e440: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
e450: 20 3d 20 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65   = nEq;..  where
e460: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
e470: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
e480: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
e490: 31 30 2c 28 22 65 71 75 61 6c 69 74 79 20 73 63  10,("equality sc
e4a0: 61 6e 20 72 65 67 69 6f 6e 73 20 25 73 28 25 64  an regions %s(%d
e4b0: 29 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ): %d\n",.      
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
e4d0: 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31 2c 20 28 69  zName, nEq-1, (i
e4e0: 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e  nt)a[1]));.  *pn
e4f0: 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20  Row = a[1];.  . 
e500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
e510: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
e520: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
e530: 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TAT4 */..#ifdef 
e540: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e550: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
e560: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
e570: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
e580: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
e590: 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
e5a0: 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
e5b0: 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
e5c0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
e5d0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
e5e0: 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
e5f0: 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
e600: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
e610: 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
e620: 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
e630: 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
e640: 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
e650: 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
e660: 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
e670: 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
e680: 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
e690: 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
e6a0: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
e6b0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
e6c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
e6d0: 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
e6e0: 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
e6f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e700: 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
e710: 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
e720: 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
e730: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
e740: 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
e750: 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
e760: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
e770: 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
e780: 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
e790: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
e7a0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
e7b0: 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
e7c0: 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
e7d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
e7e0: 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
e7f0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
e800: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
e810: 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
e820: 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  er,.  ExprList *
e830: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  pList,     /* Th
e840: 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20  e value list on 
e850: 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e  the RHS of "x IN
e860: 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22   (v1,v2,v3,...)"
e870: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
e880: 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
e890: 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
e8a0: 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
e8b0: 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
e8c0: 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
e8d0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
e8e0: 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30  dex;.  i64 nRow0
e8f0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
e900: 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f  ToInt(p->aiRowLo
e910: 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20  gEst[0]);.  int 
e920: 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
e930: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
e940: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e950: 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75  TE_OK;     /* Su
e960: 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
e970: 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
e980: 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20  nt nEst;        
e990: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e9a0: 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  rows for a singl
e9b0: 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77  e term */.  tRow
e9c0: 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b  cnt nRowEst = 0;
e9d0: 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d      /* New estim
e9e0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
e9f0: 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69  r of rows */.  i
ea00: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
ea10: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ea20: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
ea30: 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
ea40: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
ea50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ea60: 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
ea70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74  ; i++){.    nEst
ea80: 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63   = nRow0;.    rc
ea90: 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
eaa0: 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
eab0: 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b  ilder, pList->a[
eac0: 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29  i].pExpr, &nEst)
ead0: 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d  ;.    nRowEst +=
eae0: 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c   nEst;.    pBuil
eaf0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
eb00: 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a   nRecValid;.  }.
eb10: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
eb20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
eb30: 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20  nRowEst > nRow0 
eb40: 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77  ) nRowEst = nRow
eb50: 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  0;.    *pnRow = 
eb60: 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45  nRowEst;.    WHE
eb70: 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49  RETRACE(0x10,("I
eb80: 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20  N row estimate: 
eb90: 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45  est=%d\n", nRowE
eba0: 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  st));.  }.  asse
ebb0: 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
ebc0: 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c  ecValid==nRecVal
ebd0: 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  id );.  return r
ebe0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
ebf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
ec00: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
ec10: 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
ec20: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
ec30: 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65   Print the conte
ec40: 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54 65 72  nt of a WhereTer
ec50: 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  m object.*/.stat
ec60: 69 63 20 76 6f 69 64 20 77 68 65 72 65 54 65 72  ic void whereTer
ec70: 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65 72 6d  mPrint(WhereTerm
ec80: 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69 54 65   *pTerm, int iTe
ec90: 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
eca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ecb0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 54  e3DebugPrintf("T
ecc0: 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22  ERM-%-3d NULL\n"
ecd0: 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , iTerm);.  }els
ece0: 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 79 70  e{.    char zTyp
ecf0: 65 5b 34 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a  e[4];.    char z
ed00: 4c 65 66 74 5b 35 30 5d 3b 0a 20 20 20 20 6d 65  Left[50];.    me
ed10: 6d 63 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e  mcpy(zType, "...
ed20: 22 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 70  ", 4);.    if( p
ed30: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
ed40: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a  TERM_VIRTUAL ) z
ed50: 54 79 70 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20  Type[0] = 'V';. 
ed60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ed70: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
ed80: 49 56 20 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d  IV  ) zType[1] =
ed90: 20 27 45 27 3b 0a 20 20 20 20 69 66 28 20 45 78   'E';.    if( Ex
eda0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
edb0: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
edc0: 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65  romJoin) ) zType
edd0: 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20 20 20 20 69  [2] = 'L';.    i
ede0: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
edf0: 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 20  tor & WO_SINGLE 
ee00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ee10: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
ee20: 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c  (zLeft),zLeft,"l
ee30: 65 66 74 3d 7b 25 64 3a 25 64 7d 22 2c 0a 20 20  eft={%d:%d}",.  
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
ee60: 43 75 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 75  Cursor, pTerm->u
ee70: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29 3b 0a 20 20  .leftColumn);.  
ee80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
ee90: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
eea0: 57 4f 5f 4f 52 29 21 3d 30 20 26 26 20 70 54 65  WO_OR)!=0 && pTe
eeb0: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 21 3d 30  rm->u.pOrInfo!=0
eec0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
eed0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
eee0: 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22  f(zLeft),zLeft,"
eef0: 69 6e 64 65 78 61 62 6c 65 3d 30 78 25 6c 6c 64  indexable=0x%lld
ef00: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
ef10: 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d             pTerm
ef20: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
ef30: 65 78 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c  exable);.    }el
ef40: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
ef50: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
ef60: 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66 74 2c 22  f(zLeft),zLeft,"
ef70: 6c 65 66 74 3d 25 64 22 2c 20 70 54 65 72 6d 2d  left=%d", pTerm-
ef80: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
ef90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
efa0: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
efb0: 20 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70     "TERM-%-3d %p
efc0: 20 25 73 20 25 2d 31 32 73 20 70 72 6f 62 3d 25   %s %-12s prob=%
efd0: 2d 33 64 20 6f 70 3d 30 78 25 30 33 78 20 77 74  -3d op=0x%03x wt
efe0: 46 6c 61 67 73 3d 30 78 25 30 34 78 22 2c 0a 20  Flags=0x%04x",. 
eff0: 20 20 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65        iTerm, pTe
f000: 72 6d 2c 20 7a 54 79 70 65 2c 20 7a 4c 65 66 74  rm, zType, zLeft
f010: 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  , pTerm->truthPr
f020: 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65 72 6d  ob,.       pTerm
f030: 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70 54 65  ->eOperator, pTe
f040: 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a 20 20  rm->wtFlags);.  
f050: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 46 69    if( pTerm->iFi
f060: 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eld ){.      sql
f070: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f080: 22 20 69 46 69 65 6c 64 3d 25 64 5c 6e 22 2c 20  " iField=%d\n", 
f090: 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 29 3b 0a  pTerm->iField);.
f0a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f0b0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
f0c0: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
f0d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
f0e0: 56 69 65 77 45 78 70 72 28 30 2c 20 70 54 65 72  ViewExpr(0, pTer
f0f0: 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  m->pExpr, 0);.  
f100: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
f110: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
f120: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 68 6f 77  ABLED./*.** Show
f130: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
f140: 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65  ntent of a Where
f150: 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69 64 20 73  Clause.*/.void s
f160: 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73  qlite3WhereClaus
f170: 65 50 72 69 6e 74 28 57 68 65 72 65 43 6c 61 75  ePrint(WhereClau
f180: 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20  se *pWC){.  int 
f190: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
f1a0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  pWC->nTerm; i++)
f1b0: 7b 0a 20 20 20 20 77 68 65 72 65 54 65 72 6d 50  {.    whereTermP
f1c0: 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b 69 5d 2c  rint(&pWC->a[i],
f1d0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   i);.  }.}.#endi
f1e0: 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
f1f0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
f200: 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
f210: 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
f220: 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
f230: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
f240: 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
f250: 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57  (WhereLoop *p, W
f260: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
f270: 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
f280: 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
f290: 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  nfo;.  int nb = 
f2a0: 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  1+(pWInfo->pTabL
f2b0: 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a  ist->nSrc+3)/4;.
f2c0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
f2d0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
f2e0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
f2f0: 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
f300: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
f310: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 42 69 74  tem->pTab;.  Bit
f320: 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28 28 28 42  mask mAll = (((B
f330: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e 62 2a 34  itmask)1)<<(nb*4
f340: 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65  )) - 1;.  sqlite
f350: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 63  3DebugPrintf("%c
f360: 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c  %2d.%0*llx.%0*ll
f370: 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20  x", p->cId,.    
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d   p->iTab, nb, p-
f3a0: 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70  >maskSelf, nb, p
f3b0: 2d 3e 70 72 65 72 65 71 20 26 20 6d 41 6c 6c 29  ->prereq & mAll)
f3c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
f3d0: 50 72 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a  Printf(" %12s",.
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69       pItem->zAli
f400: 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  as ? pItem->zAli
f410: 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  as : pTab->zName
f420: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46  );.  if( (p->wsF
f430: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
f440: 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b  TUALTABLE)==0 ){
f450: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f460: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  *zName;.    if( 
f470: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
f480: 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d  x && (zName = p-
f490: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
f4a0: 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
f4b0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
f4c0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
f4d0: 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
f4e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
f4f0: 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
f500: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
f510: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
f520: 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
f530: 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
f540: 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
f550: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
f560: 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
f570: 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
f580: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
f590: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f5a0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f5b0: 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
f5c0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
f5d0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
f5e0: 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
f5f0: 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
f600: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f610: 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
f620: 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
f630: 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
f640: 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
f650: 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
f660: 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
f670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
f680: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f690: 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
f6a0: 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
f6b0: 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
f6c0: 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
f6d0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f6e0: 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
f6f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f700: 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (z);.  }.  if( p
f710: 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
f720: 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b 0a 20 20  E_SKIPSCAN ){.  
f730: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f740: 69 6e 74 66 28 22 20 66 20 25 30 35 78 20 25 64  intf(" f %05x %d
f750: 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73  -%d", p->wsFlags
f760: 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e  , p->nLTerm,p->n
f770: 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Skip);.  }else{.
f780: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f790: 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78 20  Printf(" f %05x 
f7a0: 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46 6c 61 67  N %d", p->wsFlag
f7b0: 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20  s, p->nLTerm);. 
f7c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
f7d0: 67 50 72 69 6e 74 66 28 22 20 63 6f 73 74 20 25  gPrintf(" cost %
f7e0: 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72  d,%d,%d\n", p->r
f7f0: 53 65 74 75 70 2c 20 70 2d 3e 72 52 75 6e 2c 20  Setup, p->rRun, 
f800: 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69 66 28 20  p->nOut);.  if( 
f810: 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 28 73 71  p->nLTerm && (sq
f820: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
f830: 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20  & 0x100)!=0 ){. 
f840: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
f850: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65  r(i=0; i<p->nLTe
f860: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
f870: 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 70  whereTermPrint(p
f880: 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20 69 29 3b  ->aLTerm[i], i);
f890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
f8a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
f8b0: 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69  rt bulk memory i
f8c0: 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72  nto a valid Wher
f8d0: 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62  eLoop that can b
f8e0: 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77  e passed.** to w
f8f0: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61  hereLoopClear ha
f900: 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61  rmlessly..*/.sta
f910: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
f920: 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70  opInit(WhereLoop
f930: 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72   *p){.  p->aLTer
f940: 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61  m = p->aLTermSpa
f950: 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20  ce;.  p->nLTerm 
f960: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  = 0;.  p->nLSlot
f970: 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   = ArraySize(p->
f980: 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20  aLTermSpace);.  
f990: 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
f9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
f9b0: 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75  he WhereLoop.u u
f9c0: 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65  nion.  Leave Whe
f9d0: 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e  reLoop.pLTerm in
f9e0: 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tact..*/.static 
f9f0: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
fa00: 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33  earUnion(sqlite3
fa10: 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
fa20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73  *p){.  if( p->ws
fa30: 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56  Flags & (WHERE_V
fa40: 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52  IRTUALTABLE|WHER
fa50: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b  E_AUTO_INDEX) ){
fa60: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
fa70: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
fa80: 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26  TUALTABLE)!=0 &&
fa90: 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
faa0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ree ){.      sql
fab0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76  ite3_free(p->u.v
fac0: 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
fad0: 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65     p->u.vtab.nee
fae0: 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
faf0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
fb00: 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 0;.    }else
fb10: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
fb20: 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
fb30: 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  DEX)!=0 && p->u.
fb40: 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
fb50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fb60: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
fb70: 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43  btree.pIndex->zC
fb80: 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71  olAff);.      sq
fb90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
fba0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
fbb0: 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62  x);.      p->u.b
fbc0: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
fbd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
fbe0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69  .** Deallocate i
fbf0: 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75  nternal memory u
fc00: 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f  sed by a WhereLo
fc10: 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  op object.*/.sta
fc20: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
fc30: 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  opClear(sqlite3 
fc40: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
fc50: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  p){.  if( p->aLT
fc60: 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
fc70: 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
fc80: 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
fc90: 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
fca0: 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
fcb0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
fcc0: 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
fcd0: 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
fce0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
fcf0: 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
fd00: 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
fd10: 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
fd20: 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
fd30: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
fd40: 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
fd50: 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
fd60: 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
fd70: 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
fd80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fd90: 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
fda0: 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
fdb0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
fdc0: 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
fdd0: 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
fde0: 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
fdf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
fe00: 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
fe10: 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
fe20: 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
fe30: 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
fe40: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
fe50: 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
fe60: 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
fe70: 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
fe80: 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
fe90: 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
fea0: 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
feb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fec0: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
fed0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
fee0: 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
fef0: 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
ff00: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
ff10: 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
ff20: 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
ff30: 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
ff40: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72   *pFrom){.  wher
ff50: 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
ff60: 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20  db, pTo);.  if( 
ff70: 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
ff80: 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
ff90: 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d  nLTerm) ){.    m
ffa0: 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30  emset(&pTo->u, 0
ffb0: 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29  , sizeof(pTo->u)
ffc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ffd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
ffe0: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54  .  }.  memcpy(pT
fff0: 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f  o, pFrom, WHERE_
10000 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20  LOOP_XFER_SZ);. 
10010 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54   memcpy(pTo->aLT
10020 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65  erm, pFrom->aLTe
10030 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a  rm, pTo->nLTerm*
10040 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65  sizeof(pTo->aLTe
10050 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  rm[0]));.  if( p
10060 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20  From->wsFlags & 
10070 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
10080 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  LE ){.    pFrom-
10090 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
100a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
100b0 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67  ( (pFrom->wsFlag
100c0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
100d0 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
100e0 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70  pFrom->u.btree.p
100f0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Index = 0;.  }. 
10100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10110 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  K;.}../*.** Dele
10120 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  te a WhereLoop o
10130 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
10140 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65  void whereLoopDe
10150 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
10160 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
10170 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
10180 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69  r(db, p);.  sqli
10190 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
101a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
101b0 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
101c0 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
101d0 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
101e0 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
101f0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
10200 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
10210 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
10220 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
10230 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
10240 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
10250 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
10260 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
10270 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[i];.      if( 
10280 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26  pLevel->pWLoop &
10290 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  & (pLevel->pWLoo
102a0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
102b0 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20  RE_IN_ABLE) ){. 
102c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
102d0 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
102e0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
102f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10300 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
10310 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
10320 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
10330 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
10340 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
10350 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
10360 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
10370 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
10380 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
10390 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
103a0 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
103b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
103c0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
103d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
103e0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
103f0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
10400 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
10410 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73  .**   (1)  X has
10420 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
10430 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a  er cost that Y.*
10440 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20  *   (2)  X is a 
10450 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
10460 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73   Y.**   (3)  X s
10470 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73  kips at least as
10480 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73   many columns as
10490 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f   Y.**.** By "pro
104a0 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d  per subset" we m
104b0 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20  ean that X uses 
104c0 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75  fewer WHERE clau
104d0 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e  se terms.** than
104e0 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72   Y and that ever
104f0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
10500 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
10510 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79   also used.** by
10520 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69   Y..**.** If X i
10530 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10540 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73  t of Y then Y is
10550 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65   a better choice
10560 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f   and ought.** to
10570 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f   have a lower co
10580 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  st.  This routin
10590 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77  e returns TRUE w
105a0 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a  hen that cost .*
105b0 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69  * relationship i
105c0 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e  s inverted and n
105d0 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73  eeds to be adjus
105e0 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20  ted.  The third 
105f0 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65  rule.** was adde
10600 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75  d because if X u
10610 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65  ses skip-scan le
10620 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69  ss than Y it sti
10630 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65  ll might.** dese
10640 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  rve a lower cost
10650 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61   even if it is a
10660 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
10670 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f Y..*/.static i
10680 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  nt whereLoopChea
10690 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
106a0 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
106b0 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a  op *pX,       /*
106c0 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70   First WhereLoop
106d0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
106e0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
106f0 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43   *pY        /* C
10700 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74  ompare against t
10710 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  his WhereLoop */
10720 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
10730 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d    if( pX->nLTerm
10740 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59  -pX->nSkip >= pY
10750 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b  ->nLTerm-pY->nSk
10760 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ip ){.    return
10770 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20   0; /* X is not 
10780 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f  a subset of Y */
10790 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e  .  }.  if( pY->n
107a0 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70  Skip > pX->nSkip
107b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
107c0 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70  f( pX->rRun >= p
107d0 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69  Y->rRun ){.    i
107e0 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59  f( pX->rRun > pY
107f0 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20  ->rRun ) return 
10800 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
10810 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
10820 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74      if( pX->nOut
10830 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65   > pY->nOut ) re
10840 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
10850 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
10860 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Y */.  }.  for(i
10870 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69  =pX->nLTerm-1; i
10880 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
10890 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  f( pX->aLTerm[i]
108a0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
108b0 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c      for(j=pY->nL
108c0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
108d0 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59  -){.      if( pY
108e0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d  ->aLTerm[j]==pX-
108f0 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65  >aLTerm[i] ) bre
10900 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
10910 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( j<0 ) return 0
10920 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75  ;  /* X not a su
10930 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20  bset of Y since 
10940 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73  term X[i] not us
10950 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20  ed by Y */.  }. 
10960 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
10970 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
10980 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
10990 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
109a0 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
109b0 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
109c0 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
109d0 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
109e0 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
109f0 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
10a00 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
10a10 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
10a20 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
10a30 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
10a40 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
10a50 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
10a60 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
10a70 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
10a80 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
10a90 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
10aa0 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10ab0 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
10ac0 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
10ad0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10ae0 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
10af0 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
10b00 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
10b10 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
10b20 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
10b30 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
10b40 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
10b50 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a  o used by Y..*/.
10b60 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
10b70 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
10b80 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
10b90 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  *p, WhereLoop *p
10ba0 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28  Template){.  if(
10bb0 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
10bc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
10bd0 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72  EXED)==0 ) retur
10be0 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
10bf0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
10c00 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
10c10 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
10c20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10c30 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
10c40 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
10c50 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
10c60 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
10c70 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
10c80 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74  bset(p, pTemplat
10c90 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  e) ){.      /* A
10ca0 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
10cb0 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f  cost downward so
10cc0 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61   that it is chea
10cd0 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20  per than its .  
10ce0 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e      ** subset p.
10cf0 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
10d00 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
10d10 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
10d20 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
10d30 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
10d50 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
10d60 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
10d70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d  ->rRun, p->nOut-
10d80 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
10d90 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
10da0 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
10db0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
10dc0 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d  >nOut - 1;.    }
10dd0 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f  else if( whereLo
10de0 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
10df0 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c  ubset(pTemplate,
10e00 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   p) ){.      /* 
10e10 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
10e20 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20   cost upward so 
10e30 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c  that it is costl
10e40 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65  ier than p since
10e50 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c  .      ** pTempl
10e60 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20  ate is a proper 
10e70 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20  subset of p */. 
10e80 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
10e90 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
10ea0 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
10eb0 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
10ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ed0 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
10ee0 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
10ef0 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
10f00 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a  n, p->nOut+1));.
10f10 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
10f20 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
10f30 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
10f40 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
10f50 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
10f60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
10f70 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
10f80 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65  eLoops in *ppPre
10f90 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e  v looking for on
10fa0 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
10fb0 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70   supplanted by p
10fc0 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Template..**.** 
10fd0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
10fe0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73  he WhereLoop lis
10ff0 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e  t contains an en
11000 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70  try that can sup
11010 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61  plant.** pTempla
11020 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  te, in other wor
11030 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20  ds if pTemplate 
11040 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
11050 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  on the list..**.
11060 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68  ** If pX is a Wh
11070 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65  ereLoop that pTe
11080 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c  mplate can suppl
11090 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ant, then return
110a0 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61   the.** link tha
110b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a  t points to pX..
110c0 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61  **.** If pTempla
110d0 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61  te cannot suppla
110e0 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  nt any existing 
110f0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
11100 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a  ist but needs.**
11110 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
11120 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72  the list, then r
11130 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
11140 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  to the tail of t
11150 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
11160 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77  ic WhereLoop **w
11170 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
11180 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  er(.  WhereLoop 
11190 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73  **ppPrev,.  cons
111a0 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  t WhereLoop *pTe
111b0 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72  mplate.){.  Wher
111c0 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28  eLoop *p;.  for(
111d0 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20  p=(*ppPrev); p; 
111e0 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
111f0 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
11200 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
11210 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
11220 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
11230 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
11240 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
11250 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
11260 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
11270 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
11280 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
11290 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
112a0 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
112b0 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
112c0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
112d0 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
112e0 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
112f0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
11300 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
11310 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
11320 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
11330 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
11340 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
11350 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
11360 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
11370 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
11380 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
11390 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
113a0 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
113b0 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
113c0 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
113d0 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
113e0 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
113f0 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
11400 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
11410 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
11420 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
11430 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
11440 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
11450 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
11460 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
11470 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
11480 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
11490 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
114a0 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
114b0 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
114c0 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
114d0 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
114e0 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
114f0 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
11500 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
11510 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
11520 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
11530 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11540 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f  ;..    /* Any lo
11550 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c  op using an appl
11560 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69  iation-defined i
11570 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59  ndex (or PRIMARY
11580 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55   KEY or.    ** U
11590 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
115a0 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f  ) with one or mo
115b0 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  re == constraint
115c0 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  s is better.    
115d0 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d  ** than an autom
115e0 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65  atic index. Unle
115f0 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d  ss it is a skip-
11600 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
11610 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
11620 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
11630 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
11640 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d  mplate->nSkip)==
11650 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
11660 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
11670 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
11680 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
11690 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
116a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
116b0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  !=0.     && (p->
116c0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
116d0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
116e0 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
116f0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
11700 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
11710 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65   If existing Whe
11720 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
11730 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
11740 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  e, pTemplate can
11750 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   be.    ** disca
11760 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70  rded.  WhereLoop
11770 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a   p is better if:
11780 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
11790 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
117a0 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70  endencies than p
117b0 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20  Template, and.  
117c0 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61    **   (2)  p ha
117d0 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
117e0 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54  wer cost than pT
117f0 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20  emplate.    */. 
11800 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
11810 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
11820 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
11830 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  q    /* (1)  */.
11840 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
11850 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
11860 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20  etup            
11870 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
11880 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
11890 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
118a0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
118b0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
118c0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
118d0 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
118e0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
118f0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20          /* (2c) 
11900 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
11910 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69  return 0;  /* Di
11920 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20  scard pTemplate 
11930 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
11940 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73   If pTemplate is
11950 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74   always better t
11960 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73  han p, then caus
11970 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
11980 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74  itten.    ** wit
11990 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54  h pTemplate.  pT
119a0 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
119b0 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20  r than p if:.   
119c0 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70   **   (1)  pTemp
119d0 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65  late has no more
119e0 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61   dependences tha
119f0 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  n p, and.    ** 
11a00 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65    (2)  pTemplate
11a10 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
11a20 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11a30 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   p..    */.    i
11a40 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
11a50 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11a60 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
11a70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20  rereq   /* (1)  
11a80 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
11a90 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
11aa0 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
11ad0 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
11ae0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
11b10 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
11b20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11b30 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
11b40 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50  etup ); /* SETUP
11b50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
11b60 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
11b70 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f     /* Cause p to
11b80 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
11b90 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
11ba0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11bb0 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a  rn ppPrev;.}../*
11bc0 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
11bd0 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
11be0 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
11bf0 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
11c00 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
11c10 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
11c20 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
11c30 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
11c40 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
11c50 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
11c60 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
11c70 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
11c80 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
11c90 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
11ca0 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
11cb0 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
11cc0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
11cd0 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
11ce0 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
11cf0 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
11d00 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
11d10 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
11d20 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
11d30 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
11d40 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
11d50 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11d60 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
11d70 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  en we care about
11d80 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
11d90 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
11da0 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
11db0 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
11dc0 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
11dd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
11de0 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
11df0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
11e00 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
11e10 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
11e20 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
11e30 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
11e40 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
11e50 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
11e60 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
11e70 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
11e80 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
11e90 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
11ea0 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
11eb0 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
11ec0 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
11ed0 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
11ee0 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  * new template i
11ef0 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
11f00 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
11f10 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
11f20 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
11f30 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
11f40 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
11f50 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
11f60 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
11f70 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
11f80 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
11f90 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
11fa0 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
11fb0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
11fc0 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
11fd0 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
11fe0 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
11ff0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
12000 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
12010 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
12020 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  p.*/.static int 
12030 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
12040 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
12050 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
12060 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
12070 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
12080 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57  *ppPrev, *p;.  W
12090 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
120a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
120b0 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
120c0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
120d0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  rse->db;.  int r
120e0 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69  c;..  /* If pBui
120f0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
12100 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e  defined, then on
12110 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66  ly keep track of
12120 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20   the costs.  ** 
12130 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a  and prereqs..  *
12140 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72  /.  if( pBuilder
12150 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20  ->pOrSet!=0 ){. 
12160 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65     if( pTemplate
12170 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20  ->nLTerm ){.#if 
12180 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12190 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d  ED.      u16 n =
121a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
121b0 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  t->n;.      int 
121c0 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  x =.#endif.     
121d0 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70   whereOrInsert(p
121e0 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c  Builder->pOrSet,
121f0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72   pTemplate->prer
12200 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72  eq, pTemplate->r
12210 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Run,.           
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61           pTempla
12240 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57  te->nOut);.#if W
12250 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12260 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
12270 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
12280 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
12290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
122a0 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20  DebugPrintf(x?" 
122b0 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20    or-%d:  ":"   
122c0 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20  or-X:  ", n);.  
122d0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
122e0 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
122f0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
12300 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
12310 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
12330 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e    /* Look for an
12340 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
12350 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77  oop to replace w
12360 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  ith pTemplate.  
12370 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  */.  whereLoopAd
12380 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d  justCost(pWInfo-
12390 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61  >pLoops, pTempla
123a0 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20  te);.  ppPrev = 
123b0 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73  whereLoopFindLes
123c0 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ser(&pWInfo->pLo
123d0 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ops, pTemplate);
123e0 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d  ..  if( ppPrev==
123f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
12400 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
12410 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20   a WhereLoop on 
12420 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
12430 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
12440 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73  han pTemplate, s
12450 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54  o just ignore pT
12460 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57  emplate */.#if W
12470 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12480 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
12490 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
124a0 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
124b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
124c0 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70  gPrintf("   skip
124d0 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72  : ");.      wher
124e0 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
124f0 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
12500 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pWC);.    }.#end
12510 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
12520 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c  LITE_OK;  .  }el
12530 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50  se{.    p = *ppP
12540 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  rev;.  }..  /* I
12550 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
12560 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
12570 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
12580 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
12590 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
125a0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
125b0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
125c0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
125d0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
125e0 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
125f0 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
12600 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
12610 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a  ABLED /* 0x8 */.
12620 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
12630 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
12640 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b  .    if( p!=0 ){
12650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
12660 62 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61  bugPrintf("repla
12670 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ce: ");.      wh
12680 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
12690 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
126a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
126b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
126c0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 77    add: ");.    w
126d0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
126e0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
126f0 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e  r->pWC);.  }.#en
12700 64 69 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  dif.  if( p==0 )
12710 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  {.    /* Allocat
12720 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
12730 70 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  p to add to the 
12740 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20  end of the list 
12750 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d  */.    *ppPrev =
12760 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
12770 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
12780 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29  zeof(WhereLoop))
12790 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
127a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
127b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 77  OMEM_BKPT;.    w
127c0 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b  hereLoopInit(p);
127d0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  .    p->pNextLoo
127e0 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p = 0;.  }else{.
127f0 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
12800 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68  e overwriting Wh
12810 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75  ereLoop p[].  Bu
12820 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20  t before we do, 
12830 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20  first.    ** go 
12840 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 74  through the rest
12850 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64   of the list and
12860 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65   delete any othe
12870 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64 65  r entries beside
12880 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61  s.    ** p[] tha
12890 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c  t are also suppl
128a0 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74  ated by pTemplat
128b0 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f  e */.    WhereLo
128c0 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70  op **ppTail = &p
128d0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20  ->pNextLoop;.   
128e0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44   WhereLoop *pToD
128f0 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  el;.    while( *
12900 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  ppTail ){.      
12910 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f  ppTail = whereLo
12920 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54  opFindLesser(ppT
12930 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  ail, pTemplate);
12940 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61 69  .      if( ppTai
12950 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==0 ) break;.  
12960 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70      pToDel = *pp
12970 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Tail;.      if( 
12980 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61  pToDel==0 ) brea
12990 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c  k;.      *ppTail
129a0 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74   = pToDel->pNext
129b0 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54  Loop;.#if WHERET
129c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
129d0 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  0x8 */.      if(
129e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
129f0 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20  ce & 0x8 ){.    
12a00 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
12a10 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a  Printf(" delete:
12a20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65   ");.        whe
12a30 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44  reLoopPrint(pToD
12a40 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  el, pBuilder->pW
12a50 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  C);.      }.#end
12a60 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  if.      whereLo
12a70 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  opDelete(db, pTo
12a80 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
12a90 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
12aa0 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65 6d  Xfer(db, p, pTem
12ab0 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28 70  plate);.  if( (p
12ac0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
12ad0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
12ae0 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
12af0 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e 62  *pIndex = p->u.b
12b00 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
12b10 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
12b20 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29  Index->tnum==0 )
12b30 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  {.      p->u.btr
12b40 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
12b50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12b60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
12b70 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
12b80 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
12b90 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
12ba0 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
12bb0 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
12bc0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
12bd0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
12be0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
12bf0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
12c00 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
12c10 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
12c20 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
12c30 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
12c40 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
12c50 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
12c60 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
12c70 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
12c80 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
12c90 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
12ca0 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
12cb0 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
12cc0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
12cd0 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
12ce0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
12cf0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
12d00 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
12d10 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
12d20 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
12d30 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
12d40 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
12d50 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
12d60 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
12d70 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
12d80 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
12d90 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
12da0 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
12db0 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
12dc0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12dd0 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
12de0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
12df0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
12e00 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
12e10 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
12e20 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
12e30 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
12e40 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
12e50 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
12e60 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
12e70 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
12e80 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
12e90 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
12ea0 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
12eb0 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
12ec0 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
12ed0 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
12ee0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
12ef0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
12f00 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
12f10 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
12f20 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
12f30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12f40 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
12f50 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
12f60 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
12f70 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
12f80 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
12f90 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
12fa0 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
12fb0 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
12fc0 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
12fd0 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
12fe0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
12ff0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
13000 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
13010 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
13020 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
13030 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
13040 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
13050 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
13060 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
13070 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
13080 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
13090 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
130a0 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
130b0 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
130c0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
130d0 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
130e0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
130f0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
13100 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
13110 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
13120 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
13130 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
13140 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13150 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
13160 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
13170 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
13180 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
13190 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
131a0 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
131b0 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
131c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
131d0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
131e0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
131f0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13200 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
13210 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
13220 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
13230 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
13240 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
13250 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
13260 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
13270 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
13280 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
13290 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
132a0 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
132b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
132c0 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
132d0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
132e0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
132f0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
13300 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
13310 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
13320 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
13330 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
13340 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
13350 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
13360 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
13370 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
13380 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
13390 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
133a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
133b0 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
133c0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
133d0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
133e0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
133f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
13400 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13410 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
13420 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
13430 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
13440 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
13450 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
13460 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13470 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
13480 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
13490 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
134a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
134b0 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
134c0 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
134d0 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
134e0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
134f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
13500 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
13510 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
13520 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
13530 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
13540 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
13550 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
13560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13570 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
13580 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
13590 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
135a0 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
135b0 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
135c0 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
135d0 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
135e0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
135f0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
13600 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
13610 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
13620 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
13630 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
13640 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
13650 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
13660 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
13670 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
13680 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
13690 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
136a0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
136b0 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
136c0 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
136d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
136e0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
136f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13700 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
13710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13720 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
13730 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
13740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13750 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
13760 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
13770 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
13780 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
13790 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
137a0 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20 70 54 65  ./* .** Term pTe
137b0 72 6d 20 69 73 20 61 20 76 65 63 74 6f 72 20 72  rm is a vector r
137c0 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ange comparison 
137d0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 66  operation. The f
137e0 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  irst comparison.
137f0 2a 2a 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72  ** in the vector
13800 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
13810 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  d using column n
13820 45 71 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  Eq of the index.
13830 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
13840 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
13850 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 76 65  tal number of ve
13860 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73 20 74 68  ctor elements th
13870 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
13880 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  * as part of the
13890 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73 6f   range compariso
138a0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  n..**.** For exa
138b0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
138c0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 57  ry is:.**.**   W
138d0 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 28  HERE a = ? AND (
138e0 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f 2c 20 3f  b, c, d) > (?, ?
138f0 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74  , ?).**.** and t
13900 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20  he index:.**.** 
13910 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 2e    CREATE INDEX .
13920 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20 63 2c 20  .. ON (a, b, c, 
13930 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  d, e).**.** then
13940 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
13950 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
13960 77 69 74 68 20 6e 45 71 3d 31 2e 20 54 68 65 20  with nEq=1. The 
13970 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
13980 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69  n.** this case i
13990 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s 3..*/.static i
139a0 6e 74 20 77 68 65 72 65 52 61 6e 67 65 56 65 63  nt whereRangeVec
139b0 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72 73 65 20  torLen(.  Parse 
139c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
139d0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
139e0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  t */.  int iCur,
139f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13a00 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 70 49  ursor open on pI
13a10 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
13a20 49 64 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx,         /* 
13a30 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
13a40 75 73 65 64 20 66 6f 72 20 61 20 69 6e 65 71 75  used for a inequ
13a50 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
13a60 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
13a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13a80 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 65 71  mber of prior eq
13a90 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
13aa0 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e 64 65 78  ts on same index
13ab0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
13ac0 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a 20 54 68  *pTerm     /* Th
13ad0 65 20 76 65 63 74 6f 72 20 69 6e 65 71 75 61 6c  e vector inequal
13ae0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ity constraint *
13af0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  /.){.  int nCmp 
13b00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
13b10 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d 3e 70  torSize(pTerm->p
13b20 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
13b30 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70 20 3d  int i;..  nCmp =
13b40 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49 64 78   MIN(nCmp, (pIdx
13b50 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45 71 29  ->nColumn - nEq)
13b60 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
13b70 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
13b80 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d 70 61  /* Test if compa
13b90 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65 72 6d  rison i of pTerm
13ba0 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   is compatible w
13bb0 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b 6e 45  ith column (i+nE
13bc0 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  q) .    ** of th
13bd0 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 74 2c  e index. If not,
13be0 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70 2e 20   exit the loop. 
13bf0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
13c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13c10 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
13c20 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  son affinity */.
13c30 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
13c40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13c50 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63 6f 6c    /* Indexed col
13c60 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 2a 2f  umns affinity */
13c70 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
13c80 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
13c90 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
13ca0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13cb0 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  nce */.    Expr 
13cc0 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70  *pLhs = pTerm->p
13cd0 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
13ce0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13cf0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 68 73  ;.    Expr *pRhs
13d00 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
13d10 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
13d20 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 45   pRhs->flags & E
13d30 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
13d40 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73       pRhs = pRhs
13d50 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
13d60 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
13d70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13d80 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d 3e 78    pRhs = pRhs->x
13d90 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
13da0 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  pr;.    }..    /
13db0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
13dc0 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f 6d 70   LHS of the comp
13dd0 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
13de0 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  mn reference to.
13df0 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
13e00 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
13e10 69 67 68 74 20 73 6f 75 72 63 65 20 74 61 62 6c  ight source tabl
13e20 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  e. And that the 
13e30 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f 72 64 65  sort.    ** orde
13e40 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  r of the index c
13e50 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 73 61 6d  olumn is the sam
13e60 65 20 61 73 20 74 68 65 20 73 6f 72 74 20 6f 72  e as the sort or
13e70 64 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  der of the.    *
13e80 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e 64 65 78  * leftmost index
13e90 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 20   column.  */.   
13ea0 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d 54   if( pLhs->op!=T
13eb0 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 7c  K_COLUMN .     |
13ec0 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21 3d  | pLhs->iTable!=
13ed0 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70 4c  iCur .     || pL
13ee0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64  hs->iColumn!=pId
13ef0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45  x->aiColumn[i+nE
13f00 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70 49 64 78  q] .     || pIdx
13f10 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2b 6e  ->aSortOrder[i+n
13f20 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53 6f 72 74  Eq]!=pIdx->aSort
13f30 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20 20 20 29  Order[nEq].    )
13f40 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
13f50 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
13f60 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d  se( pLhs->iColum
13f70 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 0a 20  n==XN_ROWID );. 
13f80 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
13f90 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
13fa0 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78 70  pRhs, sqlite3Exp
13fb0 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29 29  rAffinity(pLhs))
13fc0 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20 73  ;.    idxaff = s
13fd0 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d  qlite3TableColum
13fe0 6e 41 66 66 69 6e 69 74 79 28 70 49 64 78 2d 3e  nAffinity(pIdx->
13ff0 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d 3e 69 43  pTable, pLhs->iC
14000 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20  olumn);.    if( 
14010 61 66 66 21 3d 69 64 78 61 66 66 20 29 20 62 72  aff!=idxaff ) br
14020 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f 6c 6c 20  eak;..    pColl 
14030 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
14040 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
14050 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73  arse, pLhs, pRhs
14060 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
14070 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14080 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14090 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
140a0 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  , pIdx->azColl[i
140b0 2b 6e 45 71 5d 29 20 29 20 62 72 65 61 6b 3b 0a  +nEq]) ) break;.
140c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
140d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
140e0 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74 68  the cost C by th
140f0 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65  e costMult facte
14100 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  r T.  This only 
14110 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d  occurs if.** com
14120 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
14130 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
14140 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ULT.*/.#ifdef SQ
14150 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
14160 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70  MULT.# define Ap
14170 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
14180 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23  r(C,T)  C += T.#
14190 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70  else.# define Ap
141a0 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
141b0 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f  r(C,T).#endif../
141c0 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20  *.** We have so 
141d0 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75 69  far matched pBui
141e0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
141f0 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66  ree.nEq terms of
14200 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70   the .** index p
14210 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61  Index. Try to ma
14220 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a  tch one more..**
14230 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
14240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
14250 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  , pBuilder->pNew
14260 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20  ->nOut contains 
14270 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
14280 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
14290 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62 79  to be visited by
142a0 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67   filtering using
142b0 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72   the nEq .** ter
142c0 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69  ms only. If it i
142d0 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73  s modified, this
142e0 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72   value is restor
142f0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a  ed before this .
14300 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
14310 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50  rns..**.** If pP
14320 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74  robe->tnum==0, t
14330 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78  hat means pIndex
14340 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78   is a fake index
14350 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a   used for the.**
14360 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
14370 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   KEY..*/.static 
14380 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
14390 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68  BtreeIndex(.  Wh
143a0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
143b0 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a  pBuilder,     /*
143c0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66   The WhereLoop f
143d0 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75  actory */.  stru
143e0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
143f0 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46  *pSrc,      /* F
14400 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
14410 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a  being analyzed *
14420 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
14430 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14440 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
14450 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67  on pSrc */.  Log
14460 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20  Est nInMul      
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14480 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74  log(Number of it
14490 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20  erations due to 
144a0 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  IN) */.){.  Wher
144b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
144c0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
144d0 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c  ;  /* WHERE anal
144e0 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  yse context */. 
144f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
14500 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
14510 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
14520 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14530 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14540 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
14550 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
14560 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f  ection malloc co
14570 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
14580 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
14590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
145a0 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
145b0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
145c0 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ion */.  WhereTe
145d0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
145e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68           /* A Wh
145f0 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f  ereTerm under co
14600 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  nsideration */. 
14610 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20   int opMask;    
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14630 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74   /* Valid operat
14640 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  ors for constrai
14650 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63  nts */.  WhereSc
14660 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20  an scan;        
14670 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
14680 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74  ator for WHERE t
14690 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
146a0 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20  k saved_prereq; 
146b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
146c0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
146d0 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20  New->prereq */. 
146e0 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72   u16 saved_nLTer
146f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
14700 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14710 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65  ue of pNew->nLTe
14720 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  rm */.  u16 save
14730 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  d_nEq;          
14740 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14750 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14760 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a  w->u.btree.nEq *
14770 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 42  /.  u16 saved_nB
14780 74 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tm;             
14790 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
147a0 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
147b0 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a 2f 0a 20  .btree.nBtm */. 
147c0 20 75 31 36 20 73 61 76 65 64 5f 6e 54 6f 70 3b   u16 saved_nTop;
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
147f0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
14800 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20 20 75 31  ree.nTop */.  u1
14810 36 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20  6 saved_nSkip;  
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14830 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14840 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 2a  of pNew->nSkip *
14850 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 77 73  /.  u32 saved_ws
14860 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
14870 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14880 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77  value of pNew->w
14890 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45  sFlags */.  LogE
148a0 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20  st saved_nOut;  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
148c0 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
148d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20   pNew->nOut */. 
148e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
148f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
14900 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
14910 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
14920 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
14930 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14940 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
14950 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
14960 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
14970 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
14980 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
14990 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
149a0 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
149b0 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
149c0 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
149d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
149e0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
149f0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
14a00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14a10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14a20 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 57  _NOMEM_BKPT;.  W
14a30 48 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c  HERETRACE(0x800,
14a40 20 28 22 42 45 47 49 4e 20 61 64 64 42 74 72 65   ("BEGIN addBtre
14a50 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64  eIdx(%s), nEq=%d
14a60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14a70 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62 65            pProbe
14a80 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 75  ->zName, pNew->u
14a90 2e 62 74 72 65 65 2e 6e 45 71 29 29 3b 0a 0a 20  .btree.nEq));.. 
14aa0 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e   assert( (pNew->
14ab0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
14ac0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
14ad0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
14ae0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
14af0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
14b00 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  =0 );.  if( pNew
14b10 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
14b20 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
14b30 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c     opMask = WO_L
14b40 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
14b50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
14b60 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
14b70 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70 4d 61 73  ==0 );.    opMas
14b80 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
14b90 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
14ba0 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55 4c  T|WO_LE|WO_ISNUL
14bb0 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20 69  L|WO_IS;.  }.  i
14bc0 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  f( pProbe->bUnor
14bd0 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20 26  dered ) opMask &
14be0 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  = ~(WO_GT|WO_GE|
14bf0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a 20  WO_LT|WO_LE);.. 
14c00 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75   assert( pNew->u
14c10 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62  .btree.nEq<pProb
14c20 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20  e->nColumn );.. 
14c30 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
14c40 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
14c50 20 20 73 61 76 65 64 5f 6e 42 74 6d 20 3d 20 70    saved_nBtm = p
14c60 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
14c70 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54 6f 70 20  m;.  saved_nTop 
14c80 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
14c90 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64 5f 6e 53  nTop;.  saved_nS
14ca0 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69  kip = pNew->nSki
14cb0 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72  p;.  saved_nLTer
14cc0 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  m = pNew->nLTerm
14cd0 3b 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67  ;.  saved_wsFlag
14ce0 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  s = pNew->wsFlag
14cf0 73 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65  s;.  saved_prere
14d00 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  q = pNew->prereq
14d10 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d  ;.  saved_nOut =
14d20 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70   pNew->nOut;.  p
14d30 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e  Term = whereScan
14d40 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75 69  Init(&scan, pBui
14d50 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63 2d  lder->pWC, pSrc-
14d60 3e 69 43 75 72 73 6f 72 2c 20 73 61 76 65 64 5f  >iCursor, saved_
14d70 6e 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nEq,.           
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d               opM
14d90 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
14da0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
14db0 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f  ;.  rSize = pPro
14dc0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
14dd0 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  0];.  rLogSize =
14de0 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
14df0 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49    for(; rc==SQLI
14e00 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d  TE_OK && pTerm!=
14e10 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65  0; pTerm = where
14e20 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29  ScanNext(&scan))
14e30 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20  {.    u16 eOp = 
14e40 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14e50 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64  ;   /* Shorthand
14e60 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65   for pTerm->eOpe
14e70 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67  rator */.    Log
14e80 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20  Est rCostIdx;.  
14e90 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61    LogEst nOutUna
14ea0 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20 20  djusted;        
14eb0 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49  /* nOut before I
14ec0 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61 64  N() and WHERE ad
14ed0 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  justments */.   
14ee0 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69   int nIn = 0;.#i
14ef0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14f00 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
14f10 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61  4.    int nRecVa
14f20 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  lid = pBuilder->
14f30 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
14f40 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d  f.    if( (eOp==
14f50 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54  WO_ISNULL || (pT
14f60 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52  erm->wtFlags&TER
14f70 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20  M_VNULL)!=0).   
14f80 20 20 26 26 20 69 6e 64 65 78 43 6f 6c 75 6d 6e    && indexColumn
14f90 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62 65 2c 20  NotNull(pProbe, 
14fa0 73 61 76 65 64 5f 6e 45 71 29 0a 20 20 20 20 29  saved_nEq).    )
14fb0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
14fc0 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b  ; /* ignore IS [
14fd0 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  NOT] NULL constr
14fe0 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c  aints on NOT NUL
14ff0 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  L columns */.   
15000 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
15010 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
15020 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
15030 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
15040 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
15050 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
15060 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69  of a LIKE optimi
15070 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e  zation range con
15080 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74  straint.    ** t
15090 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77  o mix with a low
150a0 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66  er range bound f
150b0 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73  rom some other s
150c0 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  ource */.    if(
150d0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
150e0 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26  & TERM_LIKEOPT &
150f0 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
15100 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74  or==WO_LT ) cont
15110 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
15120 20 6e 6f 74 20 61 6c 6c 6f 77 20 49 53 20 63 6f   not allow IS co
15130 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d 20 74  nstraints from t
15140 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
15150 74 6f 20 62 65 20 75 73 65 64 20 62 79 20 74 68  to be used by th
15160 65 0a 20 20 20 20 2a 2a 20 72 69 67 68 74 20 74  e.    ** right t
15170 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
15180 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f 6e 73 74  OIN.  Only const
15190 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 4f 4e  raints in the ON
151a0 20 63 6c 61 75 73 65 20 61 72 65 0a 20 20 20 20   clause are.    
151b0 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  ** allowed */.  
151c0 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67 2e    if( (pSrc->fg.
151d0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
151e0 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 21  FT)!=0.     && !
151f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15200 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
15210 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
15220 26 26 20 28 65 4f 70 20 26 20 28 57 4f 5f 49 53  && (eOp & (WO_IS
15230 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 0a  |WO_ISNULL))!=0.
15240 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
15250 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
15260 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
15270 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
15280 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 63  SNULL );.      c
15290 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
152a0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
152b0 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
152c0 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  s;.    pNew->u.b
152d0 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
152e0 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
152f0 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73  u.btree.nBtm = s
15300 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 20 20 70  aved_nBtm;.    p
15310 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
15320 70 20 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a  p = saved_nTop;.
15330 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
15340 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
15350 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
15360 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
15370 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
15380 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f  1) ) break; /* O
15390 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  OM */.    pNew->
153a0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
153b0 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
153c0 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
153d0 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71   = (saved_prereq
153e0 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
153f0 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e  Right) & ~pNew->
15400 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61  maskSelf;..    a
15410 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30  ssert( nInMul==0
15420 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
15430 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
15440 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21  RE_COLUMN_NULL)!
15450 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  =0 .        || (
15460 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15470 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
15480 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  !=0 .        || 
15490 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
154a0 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29   WHERE_SKIPSCAN)
154b0 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20  !=0 .    );..   
154c0 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e   if( eOp & WO_IN
154d0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
154e0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
154f0 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
15500 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
15510 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20  RE_COLUMN_IN;.  
15520 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
15530 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15540 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
15550 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
15560 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
15570 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c   TUNING: the SEL
15580 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72  ECT returns 25 r
15590 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ows */.        i
155a0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 49  nt i;.        nI
155b0 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28  n = 46;  assert(
155c0 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
155d0 73 74 28 32 35 29 20 29 3b 0a 0a 20 20 20 20 20  st(25) );..     
155e0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
155f0 73 69 6f 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c  sion may actuall
15600 79 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  y be of the form
15610 20 28 78 2c 20 79 29 20 49 4e 20 28 53 45 4c 45   (x, y) IN (SELE
15620 43 54 2e 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20  CT...)..        
15630 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
15640 74 68 65 72 65 20 69 73 20 61 20 73 65 70 61 72  there is a separ
15650 61 74 65 20 74 65 72 6d 20 66 6f 72 20 65 61 63  ate term for eac
15660 68 20 6f 66 20 28 78 29 20 61 6e 64 20 28 79 29  h of (x) and (y)
15670 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77  ..        ** How
15680 65 76 65 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75  ever, the nIn mu
15690 6c 74 69 70 6c 69 65 72 20 73 68 6f 75 6c 64 20  ltiplier should 
156a0 6f 6e 6c 79 20 62 65 20 61 70 70 6c 69 65 64 20  only be applied 
156b0 6f 6e 63 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20  once, not once. 
156c0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 65 61         ** for ea
156d0 63 68 20 73 75 63 68 20 74 65 72 6d 2e 20 54 68  ch such term. Th
156e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70  e following loop
156f0 20 63 68 65 63 6b 73 20 74 68 61 74 20 70 54 65   checks that pTe
15700 72 6d 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  rm is the.      
15710 20 20 2a 2a 20 66 69 72 73 74 20 73 75 63 68 20    ** first such 
15720 74 65 72 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64  term in use, and
15730 20 73 65 74 73 20 6e 49 6e 20 62 61 63 6b 20 74   sets nIn back t
15740 6f 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  o 0 if it is not
15750 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
15760 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c  (i=0; i<pNew->nL
15770 54 65 72 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  Term-1; i++){.  
15780 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
15790 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70  ->aLTerm[i] && p
157a0 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e  New->aLTerm[i]->
157b0 70 45 78 70 72 3d 3d 70 45 78 70 72 20 29 20 6e  pExpr==pExpr ) n
157c0 49 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  In = 0;.        
157d0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
157e0 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
157f0 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72  x.pList && pExpr
15800 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
15810 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
15820 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
15830 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
15840 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69        nIn = sqli
15850 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72 2d  te3LogEst(pExpr-
15860 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
15870 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15880 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
15890 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
158a0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
158b0 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65         ** change
158e0 73 20 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74  s "x IN (?)" int
158f0 6f 20 22 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20  o "x=?". */.    
15900 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
15910 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57  ( eOp & (WO_EQ|W
15920 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69  O_IS) ){.      i
15930 6e 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65  nt iCol = pProbe
15940 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64  ->aiColumn[saved
15950 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65  _nEq];.      pNe
15960 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
15970 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
15980 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76       assert( sav
15990 65 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e  ed_nEq==pNew->u.
159a0 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20  btree.nEq );.   
159b0 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f     if( iCol==XN_
159c0 52 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c  ROWID .       ||
159d0 20 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d   (iCol>0 && nInM
159e0 75 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e  ul==0 && saved_n
159f0 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
15a00 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a  Col-1).      ){.
15a10 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
15a20 3e 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75  >=0 && pProbe->u
15a30 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  niqNotNull==0 ){
15a40 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
15a50 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
15a60 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20  E_UNQ_WANTED;.  
15a70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15a80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
15a90 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
15aa0 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EROW;.        }.
15ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15ac0 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49  e if( eOp & WO_I
15ad0 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  SNULL ){.      p
15ae0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15af0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
15b00 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
15b10 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f   eOp & (WO_GT|WO
15b20 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65  _GE) ){.      te
15b30 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
15b40 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
15b50 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
15b60 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
15b70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
15b80 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
15b90 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
15ba0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
15bb0 74 72 65 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72  tree.nBtm = wher
15bc0 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
15bd0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
15be0 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
15bf0 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  , pProbe, saved_
15c00 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20  nEq, pTerm.     
15c10 20 29 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d   );.      pBtm =
15c20 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
15c30 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
15c40 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
15c50 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
15c60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61  ){.        /* Ra
15c70 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74  nge contraints t
15c80 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68  hat come from th
15c90 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  e LIKE optimizat
15ca0 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20  ion are.        
15cb0 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20 69  ** always used i
15cc0 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20  n pairs. */.    
15cd0 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72      pTop = &pTer
15ce0 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  m[1];.        as
15cf0 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65  sert( (pTop-(pTe
15d00 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65  rm->pWC->a))<pTe
15d10 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29  rm->pWC->nTerm )
15d20 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15d30 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20  ( pTop->wtFlags 
15d40 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
15d50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15d60 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f  ( pTop->eOperato
15d70 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20  r==WO_LT );.    
15d80 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
15d90 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
15da0 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
15db0 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f  ) ) break; /* OO
15dc0 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  M */.        pNe
15dd0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
15de0 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70  nLTerm++] = pTop
15df0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
15e00 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
15e10 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
15e20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
15e30 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20  e.nTop = 1;.    
15e40 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
15e50 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
15e60 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
15e70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15e80 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
15e90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15ea0 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
15eb0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
15ec0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
15ed0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
15ee0 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
15ef0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
15f00 2e 6e 54 6f 70 20 3d 20 77 68 65 72 65 52 61 6e  .nTop = whereRan
15f10 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20  geVectorLen(.   
15f20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
15f30 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  Src->iCursor, pP
15f40 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c  robe, saved_nEq,
15f50 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a   pTerm.      );.
15f60 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65        pTop = pTe
15f70 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  rm;.      pBtm =
15f80 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
15f90 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
15fa0 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  T)!=0 ?.        
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
15fc0 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
15fd0 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20  nLTerm-2] : 0;. 
15fe0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
15ff0 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d  this point pNew-
16000 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  >nOut is set to 
16010 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
16020 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20  ws expected to. 
16030 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64     ** be visited
16040 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63   by the index sc
16050 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64  an before consid
16060 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d  ering term pTerm
16070 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
16080 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e  values of nIn an
16090 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68  d nInMul. In oth
160a0 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69  er words, assumi
160b0 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20  ng that all .   
160c0 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20   ** "x IN(...)" 
160d0 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63  terms are replac
160e0 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e  ed with "x = ?".
160f0 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61   This block upda
16100 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  tes.    ** the v
16110 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
16120 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ut to account fo
16130 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74  r pTerm (but not
16140 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a   nIn/nInMul).  *
16150 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
16160 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
16170 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20  nOut );.    if( 
16180 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
16190 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
161a0 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  GE ){.      /* A
161b0 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67  djust nOut using
161c0 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74   stat3/stat4 dat
161d0 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20  a. Or, if there 
161e0 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74  is no stat3/stat
161f0 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c  4.      ** data,
16200 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65   using some othe
16210 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a  r estimate.  */.
16220 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
16230 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
16240 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20  pBuilder, pBtm, 
16250 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  pTop, pNew);.   
16260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
16270 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e  t nEq = ++pNew->
16280 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20  u.btree.nEq;.   
16290 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26     assert( eOp &
162a0 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45   (WO_ISNULL|WO_E
162b0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29  Q|WO_IN|WO_IS) )
162c0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
162d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
162e0 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20  ed_nOut );.     
162f0 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
16300 68 50 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f  hProb<=0 && pPro
16310 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76  be->aiColumn[sav
16320 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20  ed_nEq]>=0 ){.  
16330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
16340 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
16350 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
16360 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
16370 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
16380 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
16390 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
163a0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
163b0 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
163c0 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
163d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
163e0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
163f0 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
16400 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
16410 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
16420 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
16430 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
16440 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
16450 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
16460 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
16470 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
16480 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
16490 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
164a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
164b0 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
164c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
164d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
164e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
164f0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
16500 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
16510 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29  ULL|WO_IS))!=0 )
16520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
16530 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
16540 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _EQ );.         
16550 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
16560 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
16570 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16580 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
16590 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  L );.           
165a0 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
165b0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
165c0 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
165d0 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b  >pRight, &nOut);
165e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
165f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
16600 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
16610 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
16620 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
16630 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
16640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16650 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16660 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
16670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16680 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16690 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
166a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
166b0 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65  p out of the pTe
166c0 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  rm loop */.     
166d0 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b       if( nOut ){
166e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
166f0 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
16700 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20  3LogEst(nOut);. 
16710 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
16720 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f  New->nOut>saved_
16730 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75  nOut ) pNew->nOu
16740 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
16750 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
16760 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
16770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16790 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69   nOut==0 ).#endi
167a0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
167b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
167c0 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52   += (pProbe->aiR
167d0 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20  owLogEst[nEq] - 
167e0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
167f0 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20  Est[nEq-1]);.   
16800 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
16810 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
16820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
16830 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
16840 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   no likelihood()
16850 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74   value, assume t
16860 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20  hat a .         
16870 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55     ** "col IS NU
16880 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  LL" expression m
16890 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20  atches twice as 
168a0 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20  many rows .     
168b0 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f         ** as (co
168c0 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  l=?). */.       
168d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
168e0 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20  += 10;.         
168f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
16900 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16910 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20  /* Set rCostIdx 
16920 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  to the cost of v
16930 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64  isiting selected
16940 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20   rows in index. 
16950 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f  Add.    ** it to
16960 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69   pNew->rRun, whi
16970 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ch is currently 
16980 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20  set to the cost 
16990 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
169a0 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54   ** seek only. T
169b0 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20  hen, if this is 
169c0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
169d0 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f  ndex, add the co
169e0 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73  st of.    ** vis
169f0 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69  iting the rows i
16a00 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
16a10 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49  .  */.    rCostI
16a20 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  dx = pNew->nOut 
16a30 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
16a40 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63  ->szIdxRow)/pSrc
16a50 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  ->pTab->szTabRow
16a60 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
16a70 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
16a80 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43  Add(rLogSize, rC
16a90 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28  ostIdx);.    if(
16aa0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
16ab0 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  & (WHERE_IDX_ONL
16ac0 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30  Y|WHERE_IPK))==0
16ad0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
16ae0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
16af0 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
16b00 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  un, pNew->nOut +
16b10 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   16);.    }.    
16b20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
16b30 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
16b40 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e  pProbe->pTable->
16b50 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20  costMult);..    
16b60 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d  nOutUnadjusted =
16b70 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
16b80 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
16b90 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
16ba0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
16bb0 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
16bc0 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
16bd0 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
16be0 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  >pWC, pNew, rSiz
16bf0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  e);.    rc = whe
16c00 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
16c10 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20  ilder, pNew);.. 
16c20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
16c30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
16c40 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
16c50 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
16c60 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
16c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
16c80 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e  w->nOut = nOutUn
16c90 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a  adjusted;.    }.
16ca0 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
16cb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16cc0 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20  TOP_LIMIT)==0.  
16cd0 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
16ce0 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
16cf0 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20  nColumn.    ){. 
16d00 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
16d10 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
16d20 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
16d30 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b  be, nInMul+nIn);
16d40 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
16d50 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
16d60 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ut;.#ifdef SQLIT
16d70 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
16d80 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69  R_STAT4.    pBui
16d90 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
16da0 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  = nRecValid;.#en
16db0 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  dif.  }.  pNew->
16dc0 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70  prereq = saved_p
16dd0 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  rereq;.  pNew->u
16de0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
16df0 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e  ed_nEq;.  pNew->
16e00 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73  u.btree.nBtm = s
16e10 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65  aved_nBtm;.  pNe
16e20 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
16e30 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20  = saved_nTop;.  
16e40 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
16e50 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
16e60 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
16e70 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
16e80 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
16e90 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
16ea0 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
16eb0 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  Term;..  /* Cons
16ec0 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69  ider using a ski
16ed0 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20  p-scan if there 
16ee0 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
16ef0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
16f00 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
16f10 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  or the left-most
16f20 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
16f30 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20  dex, and if the 
16f40 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d  average.  ** num
16f50 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69  ber of repeats i
16f60 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
16f70 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73  terms is at leas
16f80 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  t 18. .  **.  **
16f90 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   The magic numbe
16fa0 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64  r 18 is selected
16fb0 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68   on the basis th
16fc0 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72  at scanning 17 r
16fd0 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f  ows.  ** is almo
16fe0 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65  st always quicke
16ff0 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20  r than an index 
17000 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67  seek (even thoug
17010 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20  h if the index. 
17020 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77   ** contains few
17030 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77  er than 2^17 row
17040 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65  s we assume othe
17050 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70  rwise in other p
17060 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  arts of.  ** the
17070 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65   code). And, eve
17080 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  n if it is not, 
17090 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
170a0 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72   too much slower
170b0 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f  . .  ** On the o
170c0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65  ther hand, the e
170d0 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64  xtra seeks could
170e0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69   end up being si
170f0 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
17100 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e   more expensive.
17110 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34    */.  assert( 4
17120 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  2==sqlite3LogEst
17130 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61  (18) );.  if( sa
17140 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
17150 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
17160 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
17170 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
17180 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d  obe->noSkipScan=
17190 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  =0.   && pProbe-
171a0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
171b0 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f  ed_nEq+1]>=42  /
171c0 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75  * TUNING: Minimu
171d0 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  m for skip-scan 
171e0 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77  */.   && (rc = w
171f0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
17200 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
17210 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54  LTerm+1))==SQLIT
17220 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f  E_OK.  ){.    Lo
17230 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20  gEst nIter;.    
17240 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
17250 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  q++;.    pNew->n
17260 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  Skip++;.    pNew
17270 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
17280 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20  LTerm++] = 0;.  
17290 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
172a0 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41  |= WHERE_SKIPSCA
172b0 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70  N;.    nIter = p
172c0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
172d0 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20  st[saved_nEq] - 
172e0 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
172f0 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
17300 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
17310 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f   -= nIter;.    /
17320 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75  * TUNING:  Becau
17330 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73  se uncertainties
17340 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
17350 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  s for skip-scan 
17360 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20  queries,.    ** 
17370 61 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67  add a 1.375 fudg
17380 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65  e factor to make
17390 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68   skip-scan sligh
173a0 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e  tly less likely.
173b0 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d   */.    nIter +=
173c0 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f   5;.    whereLoo
173d0 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
173e0 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
173f0 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e  Probe, nIter + n
17400 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77  InMul);.    pNew
17410 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
17420 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  Out;.    pNew->u
17430 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
17440 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
17450 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
17460 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d  nSkip;.    pNew-
17470 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
17480 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20  _wsFlags;.  }.. 
17490 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30   WHERETRACE(0x80
174a0 30 2c 20 28 22 45 4e 44 20 61 64 64 42 74 72 65  0, ("END addBtre
174b0 65 49 64 78 28 25 73 29 2c 20 6e 45 71 3d 25 64  eIdx(%s), nEq=%d
174c0 2c 20 72 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  , rc=%d\n",.    
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 20 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c    pProbe->zName,
174f0 20 73 61 76 65 64 5f 6e 45 71 2c 20 72 63 29 29   saved_nEq, rc))
17500 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17510 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
17520 72 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  rue if it is pos
17530 73 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65  sible that pInde
17540 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75  x might be usefu
17550 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  l in.** implemen
17560 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
17570 59 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69  Y clause in pBui
17580 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lder..**.** Retu
17590 72 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69  rn False if pBui
175a0 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f  lder does not co
175b0 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ntain an ORDER B
175c0 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69  Y clause or.** i
175d0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  f there is no wa
175e0 79 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20  y for pIndex to 
175f0 62 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70  be useful in imp
17600 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a  lementing that.*
17610 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
17620 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17630 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
17640 69 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68  ithOrderBy(.  Wh
17650 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
17660 70 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65  pBuilder,.  Inde
17670 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74  x *pIndex,.  int
17680 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78   iCursor.){.  Ex
17690 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45  prList *pOB;.  E
176a0 78 70 72 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70  xprList *aColExp
176b0 72 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  r;.  int ii, jj;
176c0 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ..  if( pIndex->
176d0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72 65 74  bUnordered ) ret
176e0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 4f  urn 0;.  if( (pO
176f0 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  B = pBuilder->pW
17700 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d  Info->pOrderBy)=
17710 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17720 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
17730 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  B->nExpr; ii++){
17740 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
17750 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
17760 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61  ipCollate(pOB->a
17770 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  [ii].pExpr);.   
17780 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
17790 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
177a0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72  pr->iTable==iCur
177b0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sor ){.      if(
177c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
177d0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
177e0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
177f0 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
17800 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
17810 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
17820 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43  umn==pIndex->aiC
17830 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75  olumn[jj] ) retu
17840 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
17850 20 20 7d 65 6c 73 65 20 69 66 28 20 28 61 43 6f    }else if( (aCo
17860 6c 45 78 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e  lExpr = pIndex->
17870 61 43 6f 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a  aColExpr)!=0 ){.
17880 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
17890 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  jj<pIndex->nKeyC
178a0 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ol; jj++){.     
178b0 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
178c0 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f  iColumn[jj]!=XN_
178d0 45 58 50 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b  EXPR ) continue;
178e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
178f0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
17900 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e  pExpr,aColExpr->
17910 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  a[jj].pExpr,iCur
17920 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sor)==0 ){.     
17930 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
17940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17950 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17960 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17970 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
17980 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
17990 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
179a0 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
179b0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
179c0 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
179d0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
179e0 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
179f0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
17a00 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
17a10 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
17a20 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
17a30 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
17a40 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
17a50 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
17a60 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
17a70 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
17a80 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
17a90 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
17aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
17ab0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
17ac0 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
17ad0 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
17ae0 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
17af0 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
17b00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
17b10 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
17b20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
17b30 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
17b40 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
17b50 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
17b60 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
17b70 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
17b80 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
17b90 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
17ba0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
17bb0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
17bc0 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
17bd0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
17be0 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
17bf0 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
17c00 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69  rm *pTerm;.  whi
17c10 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d  le( pWhere->op==
17c20 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 69 66  TK_AND ){.    if
17c30 28 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  ( !whereUsablePa
17c40 72 74 69 61 6c 49 6e 64 65 78 28 69 54 61 62 2c  rtialIndex(iTab,
17c50 70 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66  pWC,pWhere->pLef
17c60 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
17c70 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65     pWhere = pWhe
17c80 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a  re->pRight;.  }.
17c90 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d    for(i=0, pTerm
17ca0 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
17cb0 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
17cc0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
17cd0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
17ce0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
17cf0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
17d00 45 78 70 72 28 70 45 78 70 72 2c 20 70 57 68 65  Expr(pExpr, pWhe
17d10 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20  re, iTab) .     
17d20 26 26 20 28 21 45 78 70 72 48 61 73 50 72 6f 70  && (!ExprHasProp
17d30 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
17d40 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70  romJoin) || pExp
17d50 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
17d60 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b  le==iTab).    ){
17d70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
17d80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17d90 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17da0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
17db0 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
17dc0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20  single table of 
17dd0 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74  the join where t
17de0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69  he table.** is i
17df0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 42 75  dentified by pBu
17e00 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
17e10 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
17e20 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
17e30 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74  be.** a b-tree t
17e40 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74  able, not a virt
17e50 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
17e60 20 54 68 65 20 63 6f 73 74 73 20 28 57 68 65 72   The costs (Wher
17e70 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74  eLoop.rRun) of t
17e80 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20  he b-tree loops 
17e90 61 64 64 65 64 20 62 79 20 74 68 69 73 20 66 75  added by this fu
17ea0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61  nction.** are ca
17eb0 6c 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c  lculated as foll
17ec0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ows:.**.** For a
17ed0 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75   full scan, assu
17ee0 6d 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28  ming the table (
17ef0 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69  or index) contai
17f00 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a  ns nRow rows:.**
17f10 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
17f20 52 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20  Row * 3.0       
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
17f40 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a  full-table scan.
17f50 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
17f60 6f 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20  ow * K          
17f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
17f80 63 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20  can of covering 
17f90 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73  index.**     cos
17fa0 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e  t = nRow * (K+3.
17fb0 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0)              
17fc0 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e    // scan of non
17fd0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
17fe0 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73  **.** where K is
17ff0 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e   a value between
18000 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74   1.1 and 3.0 set
18010 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
18020 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d  lative .** estim
18030 61 74 65 64 20 61 76 65 72 61 67 65 20 73 69 7a  ated average siz
18040 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  e of the index a
18050 6e 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73  nd table records
18060 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ..**.** For an i
18070 6e 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65  ndex scan, where
18080 20 6e 56 69 73 69 74 20 69 73 20 74 68 65 20 6e   nVisit is the n
18090 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72  umber of index r
180a0 6f 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62  ows visited.** b
180b0 79 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20  y the scan, and 
180c0 6e 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d  nSeek is the num
180d0 62 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72  ber of seek oper
180e0 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ations required 
180f0 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  on .** the index
18100 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   b-tree:.**.**  
18110 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
18120 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b  * (log(nRow) + K
18130 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20 20   * nVisit)      
18140 20 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20      // covering 
18150 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73  index.**     cos
18160 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67  t = nSeek * (log
18170 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29  (nRow) + (K+3.0)
18180 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f   * nVisit)    //
18190 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
181a0 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  dex.**.** Normal
181b0 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20  ly, nSeek is 1. 
181c0 6e 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65  nSeek values gre
181d0 61 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65  ater than 1 come
181e0 20 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a   about if the .*
181f0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
18200 6e 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e  ncludes "x IN (.
18210 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64  ...)" terms used
18220 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d   in place of "x=
18230 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20  ?". Or when .** 
18240 69 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28  implicit "x IN (
18250 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62  SELECT x FROM tb
18260 6c 29 22 20 74 65 72 6d 73 20 61 72 65 20 61 64  l)" terms are ad
18270 64 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  ded for skip-sca
18280 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  ns..**.** The es
18290 74 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28  timated values (
182a0 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53  nRow, nVisit, nS
182b0 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61  eek) often conta
182c0 69 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e  in a large amoun
182d0 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69  t.** of uncertai
182e0 6e 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72  nty.  For this r
182f0 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69  eason, scoring i
18300 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69  s designed to pi
18310 63 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a  ck plans that.**
18320 20 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68   "do the least h
18330 61 72 6d 22 20 69 66 20 74 68 65 20 65 73 74 69  arm" if the esti
18340 6d 61 74 65 73 20 61 72 65 20 69 6e 61 63 63 75  mates are inaccu
18350 72 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  rate.  For examp
18360 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f  le, a.** log(nRo
18370 77 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69  w) factor is omi
18380 74 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  tted from a non-
18390 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73  covering index s
183a0 63 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  can in order to.
183b0 2a 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f 72  ** bias the scor
183c0 69 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20  ing in favor of 
183d0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  using an index, 
183e0 73 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d  since the worst-
183f0 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  case.** performa
18400 6e 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  nce of using an 
18410 69 6e 64 65 78 20 69 73 20 66 61 72 20 62 65 74  index is far bet
18420 74 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72  ter than the wor
18430 73 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61  st-case performa
18440 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c  nce.** of a full
18450 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a   table scan..*/.
18460 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
18470 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20  LoopAddBtree(.  
18480 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
18490 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57   *pBuilder, /* W
184a0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
184b0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
184c0 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 20 20 20  mask mPrereq    
184d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
184e0 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20  a prerequesites 
184f0 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74  for using this t
18500 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
18510 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
18520 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
18530 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
18540 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
18550 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
18560 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
18570 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
18580 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  g */.  Index sPk
18590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
185a0 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
185b0 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
185c0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
185d0 0a 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45  .  LogEst aiRowE
185e0 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f  stPk[2];       /
185f0 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73  * The aiRowLogEs
18600 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  t[] value for th
18610 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
18620 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20   i16 aiColumnPk 
18630 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
18640 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61  The aColumn[] va
18650 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
18660 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69  index */.  SrcLi
18670 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
18680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
18690 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  OM clause */.  s
186a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
186b0 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68  em *pSrc;  /* Th
186c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74  e FROM clause bt
186d0 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20  ree term to add 
186e0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
186f0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
18700 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
18710 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
18720 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18730 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
18740 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18750 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20  .  int iSortIdx 
18760 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
18770 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  * Index number *
18780 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20  /.  int b;      
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  /* A boolean val
187b0 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  ue */.  LogEst r
187c0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
187d0 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
187e0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
187f0 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  le */.  LogEst r
18800 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
18810 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
18820 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
18830 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
18840 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ble */.  WhereCl
18850 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
18860 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
18870 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ed WHERE clause 
18880 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
18890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
188a0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
188b0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20  queried */.  .  
188c0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
188d0 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20  >pNew;.  pWInfo 
188e0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
188f0 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  fo;.  pTabList =
18900 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
18910 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62  t;.  pSrc = pTab
18920 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
18930 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70  iTab;.  pTab = p
18940 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
18950 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
18960 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56  ;.  assert( !IsV
18970 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
18980 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72  b) );..  if( pSr
18990 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 7b 0a 20  c->pIBIndex ){. 
189a0 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44     /* An INDEXED
189b0 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69   BY clause speci
189c0 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  fies a particula
189d0 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  r index to use *
189e0 2f 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  /.    pProbe = p
189f0 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20  Src->pIBIndex;. 
18a00 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73 52   }else if( !HasR
18a10 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
18a20 20 20 70 50 72 6f 62 65 20 3d 20 70 54 61 62 2d    pProbe = pTab-
18a30 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65  >pIndex;.  }else
18a40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
18a50 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
18a60 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20  clause.  Create 
18a70 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a  a fake Index obj
18a80 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20  ect in local.   
18a90 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b   ** variable sPk
18aa0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68   to represent th
18ab0 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  e rowid primary 
18ac0 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  key index.  Make
18ad0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b   this.    ** fak
18ae0 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73  e index the firs
18af0 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20  t in a chain of 
18b00 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69  Index objects wi
18b10 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  th all of the re
18b20 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  al.    ** indice
18b30 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
18b40 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74     Index *pFirst
18b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18b60 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72     /* First of r
18b70 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  eal indices on t
18b80 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
18b90 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20  memset(&sPk, 0, 
18ba0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
18bb0 20 20 20 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20      sPk.nKeyCol 
18bc0 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f  = 1;.    sPk.nCo
18bd0 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50  lumn = 1;.    sP
18be0 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
18bf0 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
18c00 6b 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20  k.aiRowLogEst = 
18c10 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20  aiRowEstPk;.    
18c20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  sPk.onError = OE
18c30 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50  _Replace;.    sP
18c40 6b 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  k.pTable = pTab;
18c50 0a 20 20 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f  .    sPk.szIdxRo
18c60 77 20 3d 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  w = pTab->szTabR
18c70 6f 77 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  ow;.    aiRowEst
18c80 50 6b 5b 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52  Pk[0] = pTab->nR
18c90 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 20 20 61 69  owLogEst;.    ai
18ca0 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b  RowEstPk[1] = 0;
18cb0 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53  .    pFirst = pS
18cc0 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  rc->pTab->pIndex
18cd0 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  ;.    if( pSrc->
18ce0 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  fg.notIndexed==0
18cf0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
18d00 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66   real indices of
18d10 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f   the table are o
18d20 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69  nly considered i
18d30 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e  f the.      ** N
18d40 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69  OT INDEXED quali
18d50 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  fier is omitted 
18d60 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c  from the FROM cl
18d70 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50  ause */.      sP
18d80 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  k.pNext = pFirst
18d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f  ;.    }.    pPro
18da0 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20  be = &sPk;.  }. 
18db0 20 72 53 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e   rSize = pTab->n
18dc0 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f  RowLogEst;.  rLo
18dd0 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72  gSize = estLog(r
18de0 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Size);..#ifndef 
18df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18e00 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a  MATIC_INDEX.  /*
18e10 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   Automatic index
18e20 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 75  es */.  if( !pBu
18e30 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 20 20  ilder->pOrSet   
18e40 20 20 20 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f     /* Not part o
18e50 66 20 61 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61  f an OR optimiza
18e60 74 69 6f 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70  tion */.   && (p
18e70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
18e80 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
18e90 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 26 26  CLAUSE)==0.   &&
18ea0 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65   (pWInfo->pParse
18eb0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
18ec0 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21  LITE_AutoIndex)!
18ed0 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70  =0.   && pSrc->p
18ee0 49 42 49 6e 64 65 78 3d 3d 30 20 20 20 20 20 20  IBIndex==0      
18ef0 2f 2a 20 48 61 73 20 6e 6f 20 49 4e 44 45 58 45  /* Has no INDEXE
18f00 44 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  D BY clause */. 
18f10 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e    && !pSrc->fg.n
18f20 6f 74 49 6e 64 65 78 65 64 20 20 20 2f 2a 20 48  otIndexed   /* H
18f30 61 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45  as no NOT INDEXE
18f40 44 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26  D clause */.   &
18f50 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
18f60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
18f70 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
18f80 62 6c 65 2e 20 28 46 49 58 4d 45 3a 20 57 68 79  ble. (FIXME: Why
18f90 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20   not?) */.   && 
18fa0 21 70 53 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72  !pSrc->fg.isCorr
18fb0 65 6c 61 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20  elated /* Not a 
18fc0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
18fd0 65 72 79 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  ery */.   && !pS
18fe0 72 63 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  rc->fg.isRecursi
18ff0 76 65 20 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63  ve  /* Not a rec
19000 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61  ursive common ta
19010 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ble expression. 
19020 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47  */.  ){.    /* G
19030 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64  enerate auto-ind
19040 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f  ex WhereLoops */
19050 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
19060 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65  pTerm;.    Where
19070 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70  Term *pWCEnd = p
19080 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
19090 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  rm;.    for(pTer
190a0 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51  m=pWC->a; rc==SQ
190b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d  LITE_OK && pTerm
190c0 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b  <pWCEnd; pTerm++
190d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
190e0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
190f0 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  & pNew->maskSelf
19100 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19110 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
19120 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
19130 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20  pSrc, 0) ){.    
19140 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
19150 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  e.nEq = 1;.     
19160 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
19170 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
19180 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
19190 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 0;.        pN
191a0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  ew->nLTerm = 1;.
191b0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c          pNew->aL
191c0 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
191d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
191e0 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73  NG: One-time cos
191f0 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20  t for computing 
19200 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
19210 64 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a  dex is.        *
19220 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62  * estimated to b
19230 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68  e X*N*log2(N) wh
19240 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
19250 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20  ber of rows in. 
19260 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61         ** the ta
19270 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
19280 64 20 61 6e 64 20 77 68 65 72 65 20 58 20 69 73  d and where X is
19290 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66   7 (LogEst=28) f
192a0 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20  or normal.      
192b0 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31    ** tables or 1
192c0 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20  .375 (LogEst=4) 
192d0 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75  for views and su
192e0 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 76  bqueries.  The v
192f0 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
19300 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20  of X is smaller 
19310 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75  for views and su
19320 62 71 75 65 72 69 65 73 20 73 6f 20 74 68 61 74  bqueries so that
19330 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
19340 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  er.        ** wi
19350 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65  ll be more aggre
19360 73 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65  ssive about gene
19370 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  rating automatic
19380 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20   indexes for.   
19390 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62       ** those ob
193a0 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65  jects, since the
193b0 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75  re is no opportu
193c0 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63 68 65  nity to add sche
193d0 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ma.        ** in
193e0 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72  dexes on subquer
193f0 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a  ies and views. *
19400 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
19410 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a  rSetup = rLogSiz
19420 65 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20  e + rSize + 4;. 
19430 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
19440 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28  >pSelect==0 && (
19450 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
19460 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
19470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
19480 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32  New->rSetup += 2
19490 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
194a0 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
194b0 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
194c0 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73  Setup, pTab->cos
194d0 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  tMult);.        
194e0 69 66 28 20 70 4e 65 77 2d 3e 72 53 65 74 75 70  if( pNew->rSetup
194f0 3c 30 20 29 20 70 4e 65 77 2d 3e 72 53 65 74 75  <0 ) pNew->rSetu
19500 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f  p = 0;.        /
19510 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
19520 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
19530 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
19540 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
19550 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
19560 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
19570 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
19580 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
19590 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
195a0 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f  ** of knowing ho
195b0 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20  w selective the 
195c0 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d  index will ultim
195d0 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f  ately be.  It wo
195e0 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  uld.        ** n
195f0 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62  ot be unreasonab
19600 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  le to make this 
19610 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65  value much large
19620 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  r. */.        pN
19630 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20  ew->nOut = 43;  
19640 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69  assert( 43==sqli
19650 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b  te3LogEst(20) );
19660 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
19670 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
19680 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
19690 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
196a0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
196b0 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs = WHERE_AUTO_
196c0 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
196d0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50  New->prereq = mP
196e0 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70  rereq | pTerm->p
196f0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
19700 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
19710 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
19720 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
19730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
19740 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
19750 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
19760 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  X */..  /* Loop 
19770 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
19780 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63  .  */.  for(; rc
19790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
197a0 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50  Probe; pProbe=pP
197b0 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f  robe->pNext, iSo
197c0 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66  rtIdx++){.    if
197d0 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  ( pProbe->pPartI
197e0 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20  dxWhere!=0.     
197f0 26 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50  && !whereUsableP
19800 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63  artialIndex(pSrc
19810 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20  ->iCursor, pWC, 
19820 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
19830 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
19840 74 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e  testcase( pNew->
19850 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72  iTab!=pSrc->iCur
19860 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74  sor );  /* See t
19870 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66  icket [98d973b8f
19880 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  5] */.      cont
19890 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61  inue;  /* Partia
198a0 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70  l index inapprop
198b0 72 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71  riate for this q
198c0 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  uery */.    }.  
198d0 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
198e0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
198f0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
19900 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20  ree.nEq = 0;.   
19910 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
19920 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Btm = 0;.    pNe
19930 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
19940 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
19950 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Skip = 0;.    pN
19960 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a  ew->nLTerm = 0;.
19970 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
19980 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  dx = 0;.    pNew
19990 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
199a0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
199b0 20 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 70 4e   mPrereq;.    pN
199c0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
199d0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
199e0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
199f0 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
19a00 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
19a10 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
19a20 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
19a30 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
19a40 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
19a50 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
19a60 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
19a70 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
19a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
19a90 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
19aa0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
19ab0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
19ac0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
19ad0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
19ae0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
19af0 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
19b00 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
19b10 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
19b20 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
19b30 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
19b40 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
19b50 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
19b60 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
19b70 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
19b80 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
19b90 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33  ble scan is (N*3
19ba0 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  .0). */.      pN
19bb0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
19bc0 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70   + 16;.      App
19bd0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
19be0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
19bf0 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
19c00 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
19c10 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
19c20 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
19c30 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
19c40 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
19c50 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
19c60 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
19c70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  e;.      if( rc 
19c80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
19c90 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
19ca0 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k m;.      if( p
19cb0 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e  Probe->isCoverin
19cc0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  g ){.        pNe
19cd0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
19ce0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
19cf0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
19d00 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20       m = 0;.    
19d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19d20 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
19d30 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
19d40 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20  ndex(pProbe);.  
19d50 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
19d60 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28  ags = (m==0) ? (
19d70 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
19d80 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20  HERE_INDEXED) : 
19d90 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
19da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
19db0 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69   Full scan via i
19dc0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
19dd0 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48  ( b.       || !H
19de0 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20  asRowid(pTab).  
19df0 20 20 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e       || pProbe->
19e00 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
19e10 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d  .       || ( m==
19e20 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
19e30 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
19e40 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
19e50 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  (pProbe->szIdxRo
19e60 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
19e70 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
19e80 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
19e90 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
19ea0 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20  S_DESIRED)==0.  
19eb0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
19ec0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55  3GlobalConfig.bU
19ed0 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26  seCis.         &
19ee0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
19ef0 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50  abled(pWInfo->pP
19f00 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
19f10 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20  _CoverIdxScan). 
19f20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
19f30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
19f40 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
19f50 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a   iSortIdx : 0;..
19f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
19f70 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
19f80 74 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69  the index rows i
19f90 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69  s N*K, where K i
19fa0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74  s.        ** bet
19fb0 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
19fc0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
19fd0 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65  he relative size
19fe0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  s of the.       
19ff0 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61   ** index and ta
1a000 62 6c 65 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20  ble rows. */.   
1a010 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
1a020 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
1a030 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
1a040 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
1a050 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
1a060 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
1a070 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a080 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
1a090 6e 64 65 78 20 73 63 61 6e 2c 20 61 64 64 20 69  ndex scan, add i
1a0a0 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20  n the cost of.  
1a0b0 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67          ** doing
1a0c0 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20   table lookups. 
1a0d0 20 54 68 65 20 63 6f 73 74 20 77 69 6c 6c 20 62   The cost will b
1a0e0 65 20 33 78 20 74 68 65 20 6e 75 6d 62 65 72 20  e 3x the number 
1a0f0 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
1a100 6c 6f 6f 6b 75 70 73 2e 20 20 54 61 6b 65 20 69  lookups.  Take i
1a110 6e 74 6f 20 61 63 63 6f 75 6e 74 20 57 48 45 52  nto account WHER
1a120 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
1a130 68 61 74 20 63 61 6e 20 62 65 0a 20 20 20 20 20  hat can be.     
1a140 20 20 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65       ** satisfie
1a150 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65  d using just the
1a160 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 61 74   index, and that
1a170 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1a180 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  a.          ** t
1a190 61 62 6c 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a  able lookup. */.
1a1a0 20 20 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74            LogEst
1a1b0 20 6e 4c 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65   nLookup = rSize
1a1c0 20 2b 20 31 36 3b 20 20 2f 2a 20 42 61 73 65 20   + 16;  /* Base 
1a1d0 63 6f 73 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20  cost:  N*3 */.  
1a1e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
1a1f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
1a200 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  ur = pSrc->iCurs
1a210 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 57 68  or;.          Wh
1a220 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 32 20  ereClause *pWC2 
1a230 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
1a240 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
1a250 3d 30 3b 20 69 69 3c 70 57 43 32 2d 3e 6e 54 65  =0; ii<pWC2->nTe
1a260 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  rm; ii++){.     
1a270 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
1a280 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 32 2d   *pTerm = &pWC2-
1a290 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  >a[ii];.        
1a2a0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
1a2b0 45 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64  ExprCoveredByInd
1a2c0 65 78 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ex(pTerm->pExpr,
1a2d0 20 69 43 75 72 2c 20 70 50 72 6f 62 65 29 20 29   iCur, pProbe) )
1a2e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a2f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1a300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1a310 20 2f 2a 20 70 54 65 72 6d 20 63 61 6e 20 62 65   /* pTerm can be
1a320 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67   evaluated using
1a330 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2e   just the index.
1a340 20 20 53 6f 20 72 65 64 75 63 65 0a 20 20 20 20    So reduce.    
1a350 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
1a360 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
1a370 66 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 20  f table lookups 
1a380 61 63 63 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a 20  accordingly */. 
1a390 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1a3a0 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
1a3b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a3c0 20 20 20 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70      nLookup += p
1a3d0 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
1a3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
1a3f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1a400 20 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20    nLookup--;.   
1a410 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1a420 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1a430 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  & (WO_EQ|WO_IS) 
1a440 29 20 6e 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b  ) nLookup -= 19;
1a450 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1a460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a470 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
1a480 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
1a490 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
1a4a0 65 77 2d 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75  ew->rRun, nLooku
1a4b0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
1a4c0 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
1a4d0 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
1a4e0 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
1a4f0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77  Mult);.        w
1a500 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
1a510 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  just(pWC, pNew, 
1a520 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  rSize);.        
1a530 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
1a540 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
1a550 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
1a560 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
1a570 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1a580 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1a590 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
1a5a0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1a5b0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
1a5c0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
1a5d0 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
1a5e0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
1a5f0 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
1a600 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
1a610 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
1a620 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
1a630 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
1a640 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
1a650 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
1a660 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1a670 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
1a680 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
1a690 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
1a6a0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
1a6b0 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
1a6c0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e   if( pSrc->pIBIn
1a6d0 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  dex ) break;.  }
1a6e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a6f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a700 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1a710 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  E../*.** Argumen
1a720 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20 61 6c  t pIdxInfo is al
1a730 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20  ready populated 
1a740 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61  with all constra
1a750 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a  ints that may.**
1a760 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
1a770 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 64  virtual table id
1a780 65 6e 74 69 66 69 65 64 20 62 79 20 70 42 75 69  entified by pBui
1a790 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
1a7a0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
1a7b0 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62 73 65  on marks a subse
1a7c0 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 73 74  t of those const
1a7d0 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c 20 69  raints usable, i
1a7e0 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 78 42  nvokes the.** xB
1a7f0 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
1a800 61 6e 64 20 61 64 64 73 20 74 68 65 20 72 65 74  and adds the ret
1a810 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20 70 42  urned plan to pB
1a820 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  uilder..**.** A 
1a830 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6d 61  constraint is ma
1a840 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66 3a 0a  rked usable if:.
1a850 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75 6d 65  **.**   * Argume
1a860 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64 69 63  nt mUsable indic
1a870 61 74 65 73 20 74 68 61 74 20 69 74 73 20 70 72  ates that its pr
1a880 65 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20  erequisites are 
1a890 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64 0a 2a  available, and.*
1a8a0 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73 20 6e  *.**   * It is n
1a8b0 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  ot one of the op
1a8c0 65 72 61 74 6f 72 73 20 73 70 65 63 69 66 69 65  erators specifie
1a8d0 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c 75 64  d in the mExclud
1a8e0 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a 2a 2a  e mask passed.**
1a8f0 20 20 20 20 20 61 73 20 74 68 65 20 66 6f 75 72       as the four
1a900 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77 68 69  th argument (whi
1a910 63 68 20 69 6e 20 70 72 61 63 74 69 63 65 20 69  ch in practice i
1a920 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e 20 6f  s either WO_IN o
1a930 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  r 0)..**.** Argu
1a940 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69 73 20  ment mPrereq is 
1a950 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  a mask of tables
1a960 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
1a970 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
1a980 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1a990 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 54  e in question. T
1a9a0 68 65 73 65 20 61 72 65 20 61 64 64 65 64 20 74  hese are added t
1a9b0 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72 65 72  o the plans prer
1a9c0 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62 65 66  equisites.** bef
1a9d0 6f 72 65 20 69 74 20 69 73 20 61 64 64 65 64 20  ore it is added 
1a9e0 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  to pBuilder..**.
1a9f0 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65  ** Output parame
1aa00 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73 65 74  ter *pbIn is set
1aa10 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
1aa20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20 70 42  plan added to pB
1aa30 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73 20 6f  uilder.** uses o
1aa40 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f 49 4e  ne or more WO_IN
1aa50 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c 73 65   terms, or false
1aa60 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1aa70 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1aa80 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1aa90 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1aaa0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
1aab0 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1aac0 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q,              
1aad0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62    /* Mask of tab
1aae0 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1aaf0 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69 74 6d   used. */.  Bitm
1ab00 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20 20 20  ask mUsable,    
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1ab20 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 74 61  ask of usable ta
1ab30 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20 6d 45  bles */.  u16 mE
1ab40 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20 20 20  xclude,         
1ab50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63            /* Exc
1ab60 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69 6e 67  lude terms using
1ab70 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73   these operators
1ab80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1ab90 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
1aba0 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  fo,   /* Populat
1abb0 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20 78 42  ed object for xB
1abc0 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31  estIndex */.  u1
1abd0 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20 20 20 20  6 mNoOmit,      
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1abf0 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20 74 68 65   Do not omit the
1ac00 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  se constraints *
1ac10 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20 20 20  /.  int *pbIn   
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65      /* OUT: True
1ac40 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 61 6e   if plan uses an
1ac50 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29   IN(...) op */.)
1ac60 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
1ac70 2a 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d  *pWC = pBuilder-
1ac80 3e 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20 73  >pWC;.  struct s
1ac90 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
1aca0 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
1acb0 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
1acc0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1acd0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
1ace0 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
1acf0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
1ad00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1ad10 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63  mxTerm;.  int rc
1ad20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ad30 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20  WhereLoop *pNew 
1ad40 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1ad50 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
1ad60 65 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  e = pBuilder->pW
1ad70 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1ad80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ad90 74 65 6d 20 2a 70 53 72 63 20 3d 20 26 70 42 75  tem *pSrc = &pBu
1ada0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
1adb0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d  TabList->a[pNew-
1adc0 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43  >iTab];.  int nC
1add0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
1ade0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
1adf0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d  t;..  assert( (m
1ae00 55 73 61 62 6c 65 20 26 20 6d 50 72 65 72 65 71  Usable & mPrereq
1ae10 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20 20  )==mPrereq );.  
1ae20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65  *pbIn = 0;.  pNe
1ae30 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65  w->prereq = mPre
1ae40 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  req;..  /* Set t
1ae50 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 20 6f  he usable flag o
1ae60 6e 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20  n the subset of 
1ae70 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e  constraints iden
1ae80 74 69 66 69 65 64 20 62 79 20 0a 20 20 2a 2a 20  tified by .  ** 
1ae90 61 72 67 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c  arguments mUsabl
1aea0 65 20 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20  e and mExclude. 
1aeb0 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
1aec0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
1aed0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1aee0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
1aef0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
1af00 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1af10 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
1af20 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  ons++){.    Wher
1af30 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
1af40 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d  pWC->a[pIdxCons-
1af50 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20  >iTermOffset];. 
1af60 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
1af70 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ble = 0;.    if(
1af80 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
1af90 69 67 68 74 20 26 20 6d 55 73 61 62 6c 65 29 3d  ight & mUsable)=
1afa0 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  =pTerm->prereqRi
1afb0 67 68 74 20 0a 20 20 20 20 20 26 26 20 28 70 54  ght .     && (pT
1afc0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1afd0 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20   mExclude)==0.  
1afe0 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43    ){.      pIdxC
1aff0 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b  ons->usable = 1;
1b000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b010 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1b020 6f 75 74 70 75 74 20 66 69 65 6c 64 73 20 6f 66  output fields of
1b030 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
1b040 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
1b050 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55  e */.  memset(pU
1b060 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
1b070 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73  pUsage[0])*nCons
1b080 74 72 61 69 6e 74 29 3b 0a 20 20 61 73 73 65 72  traint);.  asser
1b090 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  t( pIdxInfo->nee
1b0a0 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30  dToFreeIdxStr==0
1b0b0 20 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   );.  pIdxInfo->
1b0c0 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  idxStr = 0;.  pI
1b0d0 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
1b0e0 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
1b0f0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
1b100 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1b110 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
1b120 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
1b130 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70  / (double)2;.  p
1b140 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1b150 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70  edRows = 25;.  p
1b160 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
1b170 73 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  s = 0;.  pIdxInf
1b180 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71  o->colUsed = (sq
1b190 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63  lite3_int64)pSrc
1b1a0 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a  ->colUsed;..  /*
1b1b0 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72 74   Invoke the virt
1b1c0 75 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49  ual table xBestI
1b1d0 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f  ndex() method */
1b1e0 0a 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74  .  rc = vtabBest
1b1f0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 53  Index(pParse, pS
1b200 72 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49 6e  rc->pTab, pIdxIn
1b210 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  fo);.  if( rc ) 
1b220 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 78  return rc;..  mx
1b230 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73 73  Term = -1;.  ass
1b240 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  ert( pNew->nLSlo
1b250 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  t>=nConstraint )
1b260 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1b270 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
1b280 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
1b290 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e   = 0;.  pNew->u.
1b2a0 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20  vtab.omitMask = 
1b2b0 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  0;.  pIdxCons = 
1b2c0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
1b2d0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1b2e0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
1b2f0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
1b300 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1b310 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
1b320 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ons++){.    int 
1b330 69 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 28  iTerm;.    if( (
1b340 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69  iTerm = pUsage[i
1b350 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29  ].argvIndex - 1)
1b360 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
1b370 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
1b380 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 49 64       int j = pId
1b390 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
1b3a0 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  et;.      if( iT
1b3b0 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm>=nConstraint
1b3c0 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20  .       || j<0. 
1b3d0 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d        || j>=pWC-
1b3e0 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 7c 7c  >nTerm.       ||
1b3f0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
1b400 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 7c  erm]!=0.       |
1b410 7c 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62  | pIdxCons->usab
1b420 6c 65 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  le==0.      ){. 
1b430 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b440 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1b450 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b460 67 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65  g(pParse,"%s.xBe
1b470 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74  stIndex malfunct
1b480 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d  ion",pSrc->pTab-
1b490 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
1b4a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b4b0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
1b4c0 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73  se( iTerm==nCons
1b4d0 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20  traint-1 );.    
1b4e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
1b4f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1b500 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72  se( j==pWC->nTer
1b510 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 54 65  m-1 );.      pTe
1b520 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
1b530 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
1b540 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72  req |= pTerm->pr
1b550 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
1b560 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70   assert( iTerm<p
1b570 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
1b580 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
1b590 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d  m[iTerm] = pTerm
1b5a0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72  ;.      if( iTer
1b5b0 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
1b5c0 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
1b5d0 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
1b5e0 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 74 65  ==15 );.      te
1b5f0 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
1b600 36 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  6 );.      if( i
1b610 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67  Term<16 && pUsag
1b620 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77  e[i].omit ) pNew
1b630 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
1b640 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20  k |= 1<<iTerm;. 
1b650 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1b660 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1b670 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  IN)!=0 ){.      
1b680 20 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74    /* A virtual t
1b690 61 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e  able that is con
1b6a0 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49  strained by an I
1b6b0 4e 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74  N clause may not
1b6c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  .        ** cons
1b6d0 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
1b6e0 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
1b6f0 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
1b700 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
1b710 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65    ** is not nece
1b720 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  ssarily related 
1b730 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  to the order of 
1b740 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64  output terms and
1b750 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20  .        ** (2) 
1b760 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73  Multiple outputs
1b770 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49   from a single I
1b780 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74  N value will not
1b790 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 2a   merge.        *
1b7a0 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a  * together.  */.
1b7b0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
1b7c0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
1b7d0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  d = 0;.        p
1b7e0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67  IdxInfo->idxFlag
1b7f0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44  s &= ~SQLITE_IND
1b800 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a  EX_SCAN_UNIQUE;.
1b810 20 20 20 20 20 20 20 20 2a 70 62 49 6e 20 3d 20          *pbIn = 
1b820 31 3b 20 61 73 73 65 72 74 28 20 28 6d 45 78 63  1; assert( (mExc
1b830 6c 75 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  lude & WO_IN)==0
1b840 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1b850 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 75 2e  }.  }.  pNew->u.
1b860 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 26 3d  vtab.omitMask &=
1b870 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 70 4e   ~mNoOmit;..  pN
1b880 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
1b890 65 72 6d 2b 31 3b 0a 20 20 61 73 73 65 72 74 28  erm+1;.  assert(
1b8a0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70   pNew->nLTerm<=p
1b8b0 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20  New->nLSlot );. 
1b8c0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
1b8d0 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xNum = pIdxInfo-
1b8e0 3e 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d  >idxNum;.  pNew-
1b8f0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
1b900 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65   = pIdxInfo->nee
1b910 64 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20  dToFreeIdxStr;. 
1b920 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
1b930 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
1b940 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1b950 69 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66  idxStr = pIdxInf
1b960 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65  o->idxStr;.  pNe
1b970 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65  w->u.vtab.isOrde
1b980 72 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49  red = (i8)(pIdxI
1b990 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1b9a0 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64  umed ?.      pId
1b9b0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
1b9c0 3a 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  : 0);.  pNew->rS
1b9d0 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
1b9e0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
1b9f0 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
1ba00 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
1ba10 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65  atedCost);.  pNe
1ba20 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
1ba30 33 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f  3LogEst(pIdxInfo
1ba40 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29  ->estimatedRows)
1ba50 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1ba60 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61  WHERE_ONEROW fla
1ba70 67 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e  g if the xBestIn
1ba80 64 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64  dex() method ind
1ba90 69 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74  icated.  ** that
1baa0 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
1bab0 69 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65  isit at most one
1bac0 20 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f   row. Clear it o
1bad0 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69  therwise. */.  i
1bae0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  f( pIdxInfo->idx
1baf0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  Flags & SQLITE_I
1bb00 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45  NDEX_SCAN_UNIQUE
1bb10 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73   ){.    pNew->ws
1bb20 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
1bb30 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NEROW;.  }else{.
1bb40 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
1bb50 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52  s &= ~WHERE_ONER
1bb60 4f 57 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77  OW;.  }.  rc = w
1bb70 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
1bb80 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
1bb90 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
1bba0 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
1bbb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1bbc0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1bbd0 53 74 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Str);.    pNew->
1bbe0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1bbf0 3d 20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45  = 0;.  }.  WHERE
1bc00 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
1bc10 20 20 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49    bIn=%d prereqI
1bc20 6e 3d 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f  n=%04llx prereqO
1bc30 75 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20  ut=%04llx\n",.  
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69      *pbIn, (sqli
1bc60 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72  te3_uint64)mPrer
1bc70 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq,.            
1bc80 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1bc90 65 33 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d  e3_uint64)(pNew-
1bca0 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1bcb0 65 71 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  eq)));..  return
1bcc0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   rc;.}.../*.** A
1bcd0 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
1bce0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74   objects for a t
1bcf0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
1bd00 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
1bd10 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  * pBuilder->pNew
1bd20 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
1bd30 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
1bd40 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61  d to be a virtua
1bd50 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
1bd60 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c  f there are no L
1bd70 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49  EFT or CROSS JOI
1bd80 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71  N joins in the q
1bd90 75 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72  uery, both mPrer
1bda0 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61  eq and.** mUnusa
1bdb0 62 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20 30  ble are set to 0
1bdc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72  . Otherwise, mPr
1bdd0 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f  ereq is a mask o
1bde0 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  f all FROM claus
1bdf0 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  e.** entries tha
1be00 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
1be10 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1be20 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1be30 75 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73  use and are.** s
1be40 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
1be50 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
1be60 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
1be70 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  OIN. Similarly, 
1be80 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65  the.** mUnusable
1be90 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61   mask contains a
1bea0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ll FROM clause e
1beb0 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
1bec0 72 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76  r after the.** v
1bed0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64  irtual table and
1bee0 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66   are separated f
1bef0 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61  rom it by at lea
1bf00 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a  st one LEFT or .
1bf10 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a  ** CROSS JOIN. .
1bf20 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1bf30 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  e, if the query 
1bf40 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  were:.**.**   ..
1bf50 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45  . FROM t1, t2 LE
1bf60 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20  FT JOIN t3, t4, 
1bf70 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35  vt CROSS JOIN t5
1bf80 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , t6;.**.** then
1bf90 20 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73 70   mPrereq corresp
1bfa0 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29  onds to (t1, t2)
1bfb0 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74   and mUnusable t
1bfc0 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a  o (t5, t6)..**.*
1bfd0 2a 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  * All the tables
1bfe0 20 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74   in mPrereq must
1bff0 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f   be scanned befo
1c000 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  re the current v
1c010 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65  irtual .** table
1c020 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66  . So any terms f
1c030 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65  or which all pre
1c040 72 65 71 75 69 73 69 74 65 73 20 61 72 65 20 73  requisites are s
1c050 61 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20  atisfied by .** 
1c060 6d 50 72 65 72 65 71 20 6d 61 79 20 62 65 20 73  mPrereq may be s
1c070 70 65 63 69 66 69 65 64 20 61 73 20 22 75 73 61  pecified as "usa
1c080 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c  ble" in all call
1c090 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e  s to xBestIndex.
1c0a0 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c   .** Conversely,
1c0b0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d   all tables in m
1c0c0 55 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65  Unusable must be
1c0d0 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74   scanned after t
1c0e0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69  he current.** vi
1c0f0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20  rtual table, so 
1c100 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68  any terms for wh
1c110 69 63 68 20 74 68 65 20 70 72 65 72 65 71 75 69  ich the prerequi
1c120 73 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69  sites overlap wi
1c130 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20  th.** mUnusable 
1c140 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1c150 20 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22   configured as "
1c160 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20  not-usable" for 
1c170 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73  xBestIndex..*/.s
1c180 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1c190 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20  oopAddVirtual(. 
1c1a0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1c1b0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a  r *pBuilder,  /*
1c1c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
1c1d0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  formation */.  B
1c1e0 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20  itmask mPrereq, 
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c200 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1c210 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1c220 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  e this one */.  
1c230 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
1c240 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
1c250 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  Tables that must
1c260 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65   be scanned afte
1c270 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b  r this one */.){
1c280 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c290 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1c2a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c2b0 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
1c2c0 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
1c2d0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
1c2e0 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
1c2f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c310 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1c320 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
1c330 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
1c340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1c350 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1c360 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c370 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
1c380 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1c390 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
1c3a0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
1c3b0 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20  _info *p;       
1c3c0 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73  /* Object to pas
1c3d0 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28  s to xBestIndex(
1c3e0 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  ) */.  int nCons
1c3f0 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
1c400 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c410 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1c420 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20  p */.  int bIn; 
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c440 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
1c450 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29  lan uses IN(...)
1c460 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57   operator */.  W
1c470 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
1c480 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b    Bitmask mBest;
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c4a0 2a 20 54 61 62 6c 65 73 20 75 73 65 64 20 62 79  * Tables used by
1c4b0 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70   best possible p
1c4c0 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f  lan */.  u16 mNo
1c4d0 4f 6d 69 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  Omit;..  assert(
1c4e0 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75   (mPrereq & mUnu
1c4f0 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70  sable)==0 );.  p
1c500 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
1c510 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72  ->pWInfo;.  pPar
1c520 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1c530 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  rse;.  pWC = pBu
1c540 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
1c550 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1c560 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
1c570 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1c580 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
1c590 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
1c5a0 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
1c5b0 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74  );.  p = allocat
1c5c0 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73  eIndexInfo(pPars
1c5d0 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c  e, pWC, mUnusabl
1c5e0 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65  e, pSrc, pBuilde
1c5f0 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20 20  r->pOrderBy, .  
1c600 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a 20      &mNoOmit);. 
1c610 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1c620 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
1c630 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  BKPT;.  pNew->rS
1c640 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
1c650 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
1c660 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
1c670 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1c680 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
1c690 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
1c6a0 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
1c6b0 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b   p->nConstraint;
1c6c0 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  .  if( whereLoop
1c6d0 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64  Resize(pParse->d
1c6e0 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72  b, pNew, nConstr
1c6f0 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  aint) ){.    sql
1c700 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1c710 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72  e->db, p);.    r
1c720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1c730 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
1c740 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42  /* First call xB
1c750 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20  estIndex() with 
1c760 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  all constraints 
1c770 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45  usable. */.  WHE
1c780 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22  RETRACE(0x40, ("
1c790 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c    VirtualOne: al
1c7a0 6c 20 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20  l usable\n"));. 
1c7b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1c7c0 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75  ddVirtualOne(pBu
1c7d0 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1c7e0 41 4c 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d  ALLBITS, 0, p, m
1c7f0 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a  NoOmit, &bIn);..
1c800 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
1c810 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1c820 20 77 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20   with all terms 
1c830 65 6e 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64  enabled produced
1c840 20 61 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61   a plan.  ** tha
1c850 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
1c860 72 65 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61  re any source ta
1c870 62 6c 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61  bles (IOW: a pla
1c880 6e 20 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29  n with mBest==0)
1c890 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72  ,.  ** then ther
1c8a0 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1c8b0 20 6d 61 6b 69 6e 67 20 61 6e 79 20 66 75 72 74   making any furt
1c8c0 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  her calls to xBe
1c8d0 73 74 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20  stIndex() .  ** 
1c8e0 73 69 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20  since they will 
1c8f0 61 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73  all return the s
1c900 61 6d 65 20 72 65 73 75 6c 74 20 28 69 66 20 74  ame result (if t
1c910 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a  he xBestIndex().
1c920 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74    ** implementat
1c930 69 6f 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f  ion is sane). */
1c940 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c950 45 5f 4f 4b 20 26 26 20 28 6d 42 65 73 74 20 3d  E_OK && (mBest =
1c960 20 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26   (pNew->prereq &
1c970 20 7e 6d 50 72 65 72 65 71 29 29 21 3d 30 20 29   ~mPrereq))!=0 )
1c980 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65  {.    int seenZe
1c990 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ro = 0;         
1c9a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
1c9b0 20 70 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72   plan with no pr
1c9c0 65 72 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20  ereqs seen */.  
1c9d0 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f    int seenZeroNo
1c9e0 49 4e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  IN = 0;         
1c9f0 2f 2a 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20  /* Plan with no 
1ca00 70 72 65 72 65 71 73 20 61 6e 64 20 6e 6f 20 49  prereqs and no I
1ca10 4e 28 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20  N(...) seen */. 
1ca20 20 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 76     Bitmask mPrev
1ca30 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73   = 0;.    Bitmas
1ca40 6b 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b  k mBestNoIn = 0;
1ca50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1ca60 70 6c 61 6e 20 70 72 6f 64 75 63 65 64 20 62 79  plan produced by
1ca70 20 74 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c   the earlier cal
1ca80 6c 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e  l uses an IN(...
1ca90 29 20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20  ) term, call.   
1caa0 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 61   ** xBestIndex a
1cab0 67 61 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 20  gain, this time 
1cac0 77 69 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72  with IN(...) ter
1cad0 6d 73 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a  ms disabled. */.
1cae0 20 20 20 20 69 66 28 20 62 49 6e 20 29 7b 0a 20      if( bIn ){. 
1caf0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1cb00 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1cb10 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65  lOne: all usable
1cb20 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20   w/o IN\n"));.  
1cb30 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1cb40 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1cb50 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c  .          pBuil
1cb60 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c  der, mPrereq, AL
1cb70 4c 42 49 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c  LBITS, WO_IN, p,
1cb80 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1cb90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62  .      assert( b
1cba0 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  In==0 );.      m
1cbb0 42 65 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d  BestNoIn = pNew-
1cbc0 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1cbd0 65 71 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 42  eq;.      if( mB
1cbe0 65 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20  estNoIn==0 ){.  
1cbf0 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d        seenZero =
1cc00 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   1;.        seen
1cc10 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20  ZeroNoIN = 1;.  
1cc20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1cc30 20 2f 2a 20 43 61 6c 6c 20 78 42 65 73 74 49 6e   /* Call xBestIn
1cc40 64 65 78 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  dex once for eac
1cc50 68 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65  h distinct value
1cc60 20 6f 66 20 28 70 72 65 72 65 71 52 69 67 68 74   of (prereqRight
1cc70 20 26 20 7e 6d 50 72 65 72 65 71 29 20 0a 20 20   & ~mPrereq) .  
1cc80 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 65 74 20    ** in the set 
1cc90 6f 66 20 74 65 72 6d 73 20 74 68 61 74 20 61 70  of terms that ap
1cca0 70 6c 79 20 74 6f 20 74 68 65 20 63 75 72 72 65  ply to the curre
1ccb0 6e 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  nt virtual table
1ccc0 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  .  */.    while(
1ccd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cce0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1ccf0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65       Bitmask mNe
1cd00 78 74 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20  xt = ALLBITS;.  
1cd10 20 20 20 20 61 73 73 65 72 74 28 20 6d 4e 65 78      assert( mNex
1cd20 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  t>0 );.      for
1cd30 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
1cd40 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  int; i++){.     
1cd50 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 68 69 73     Bitmask mThis
1cd60 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20   = (.           
1cd70 20 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73   pWC->a[p->aCons
1cd80 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
1cd90 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67  ffset].prereqRig
1cda0 68 74 20 26 20 7e 6d 50 72 65 72 65 71 0a 20 20  ht & ~mPrereq.  
1cdb0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1cdc0 20 69 66 28 20 6d 54 68 69 73 3e 6d 50 72 65 76   if( mThis>mPrev
1cdd0 20 26 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20   && mThis<mNext 
1cde0 29 20 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b  ) mNext = mThis;
1cdf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1ce00 50 72 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20  Prev = mNext;.  
1ce10 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41      if( mNext==A
1ce20 4c 4c 42 49 54 53 20 29 20 62 72 65 61 6b 3b 0a  LLBITS ) break;.
1ce30 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d        if( mNext=
1ce40 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d  =mBest || mNext=
1ce50 3d 6d 42 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e  =mBestNoIn ) con
1ce60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45  tinue;.      WHE
1ce70 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22  RETRACE(0x40, ("
1ce80 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50    VirtualOne: mP
1ce90 72 65 76 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74  rev=%04llx mNext
1cea0 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20  =%04llx\n",.    
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74     (sqlite3_uint
1ced0 36 34 29 6d 50 72 65 76 2c 20 28 73 71 6c 69 74  64)mPrev, (sqlit
1cee0 65 33 5f 75 69 6e 74 36 34 29 6d 4e 65 78 74 29  e3_uint64)mNext)
1cef0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
1cf00 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1cf10 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20  lOne(.          
1cf20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1cf30 71 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71  q, mNext|mPrereq
1cf40 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c  , 0, p, mNoOmit,
1cf50 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66   &bIn);.      if
1cf60 28 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d  ( pNew->prereq==
1cf70 6d 50 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20  mPrereq ){.     
1cf80 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1cf90 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 49 6e  .        if( bIn
1cfa0 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f  ==0 ) seenZeroNo
1cfb0 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1cfc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1cfd0 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42   the calls to xB
1cfe0 65 73 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68  estIndex() in th
1cff0 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64  e above loop did
1d000 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e   not find a plan
1d010 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71  .    ** that req
1d020 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20  uires no source 
1d030 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69  tables at all (i
1d040 2e 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65  .e. one guarante
1d050 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ed to be.    ** 
1d060 75 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20  usable), make a 
1d070 63 61 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61  call here with a
1d080 6c 6c 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  ll source tables
1d090 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20   disabled */.   
1d0a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d0b0 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d  OK && seenZero==
1d0c0 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  0 ){.      WHERE
1d0d0 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1d0e0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1d0f0 64 69 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20  disabled\n"));. 
1d100 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1d110 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1d120 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69  (.          pBui
1d130 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1d140 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e  Prereq, 0, p, mN
1d150 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20  oOmit, &bIn);.  
1d160 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29      if( bIn==0 )
1d170 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20   seenZeroNoIN = 
1d180 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
1d190 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f   If the calls to
1d1a0 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 68 61   xBestIndex() ha
1d1b0 76 65 20 73 6f 20 66 61 72 20 66 61 69 6c 65 64  ve so far failed
1d1c0 20 74 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a   to find a plan.
1d1d0 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75      ** that requ
1d1e0 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74  ires no source t
1d1f0 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e 64  ables at all and
1d200 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e   does not use an
1d210 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20   IN(...).    ** 
1d220 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61  operator, make a
1d230 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f   final call to o
1d240 62 74 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20  btain one here. 
1d250 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1d260 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65  SQLITE_OK && see
1d270 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a  nZeroNoIN==0 ){.
1d280 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1d290 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1d2a0 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62  alOne: all disab
1d2b0 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e  led and w/o IN\n
1d2c0 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1d2d0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1d2e0 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20  ualOne(.        
1d2f0 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65    pBuilder, mPre
1d300 72 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f  req, mPrereq, WO
1d310 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c  _IN, p, mNoOmit,
1d320 20 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   &bIn);.    }.  
1d330 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64  }..  if( p->need
1d340 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73  ToFreeIdxStr ) s
1d350 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69  qlite3_free(p->i
1d360 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
1d370 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1d380 64 62 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  db, p);.  return
1d390 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1d3a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1d3b0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
1d3c0 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f  .** Add WhereLoo
1d3d0 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e  p entries to han
1d3e0 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54  dle OR terms.  T
1d3f0 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69  his works for ei
1d400 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f  ther.** btrees o
1d410 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
1d420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d430 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a  whereLoopAddOr(.
1d440 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
1d450 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20  er *pBuilder, . 
1d460 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
1d470 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  , .  Bitmask mUn
1d480 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72  usable.){.  Wher
1d490 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
1d4a0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1d4b0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
1d4c0 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
1d4d0 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
1d4e0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
1d4f0 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
1d500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1d510 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
1d520 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
1d530 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1d540 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
1d550 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
1d560 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
1d570 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1d580 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
1d590 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1d5a0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
1d5b0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
1d5c0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1d5d0 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
1d5e0 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
1d5f0 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
1d600 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
1d610 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
1d620 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
1d630 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
1d640 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1d650 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
1d660 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1d670 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
1d680 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1d690 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
1d6a0 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1d6b0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
1d6c0 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
1d6d0 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
1d6e0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
1d6f0 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
1d700 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
1d710 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1d720 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
1d730 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
1d740 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
1d750 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
1d760 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
1d770 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
1d780 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
1d790 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
1d7a0 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
1d7b0 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
1d7c0 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
1d7d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
1d7e0 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
1d7f0 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45  sCur;..      WHE
1d800 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1d810 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "Begin processin
1d820 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
1d830 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
1d840 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
1d850 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
1d860 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
1d870 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1d880 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
1d890 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
1d8a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d8b0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1d8c0 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
1d8d0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1d8e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
1d8f0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1d900 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
1d910 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
1d920 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
1d930 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1d940 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
1d950 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1d960 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
1d970 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
1d980 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
1d990 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
1d9a0 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
1d9b0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1d9c0 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
1d9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d9e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1d9f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1da00 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65  Cur.n = 0;.#ifde
1da10 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
1da20 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45  BLED.        WHE
1da30 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
1da40 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25  "OR-term %d of %
1da50 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d  p has %d subterm
1da60 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s:\n", .        
1da70 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1da80 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e  (pOrTerm-pOrWC->
1da90 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42  a), pTerm, sSubB
1daa0 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29  uild.pWC->nTerm)
1dab0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1dac0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
1dad0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
1dae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1daf0 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73 53  reClausePrint(sS
1db00 75 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20  ubBuild.pWC);.  
1db10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23        }.#endif.#
1db20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1db30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1db40 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
1db50 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
1db60 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
1db70 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1db80 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
1db90 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  ild, mPrereq, mU
1dba0 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  nusable);.      
1dbb0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1dbc0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1dbd0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1dbe0 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42  pAddBtree(&sSubB
1dbf0 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a  uild, mPrereq);.
1dc00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dc10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dc20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1dc30 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1dc40 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c  ddOr(&sSubBuild,
1dc50 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1dc60 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ble);.        }.
1dc70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1dc80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1dc90 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
1dca0 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
1dcb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1dcc0 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1dcd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1dce0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dcf0 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1dd00 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1dd10 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
1dd20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1dd30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1dd40 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
1dd50 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
1dd60 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
1dd70 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
1dd80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
1dd90 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1dda0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
1ddb0 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
1ddc0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1ddd0 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
1dde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
1ddf0 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
1de00 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
1de10 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
1de20 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1de50 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1de60 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
1de70 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1dea0 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1deb0 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
1dec0 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
1ded0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dee0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1def0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
1df00 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
1df10 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
1df20 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
1df30 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1df40 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
1df50 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
1df60 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
1df70 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
1df80 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
1df90 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
1dfa0 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
1dfb0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
1dfc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dfd0 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
1dfe0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
1dff0 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
1e000 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
1e010 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
1e020 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
1e030 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
1e040 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
1e050 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
1e060 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
1e070 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
1e080 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
1e090 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
1e0a0 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
1e0b0 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
1e0c0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
1e0d0 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
1e0e0 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
1e0f0 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
1e100 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
1e110 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
1e120 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
1e130 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
1e140 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
1e150 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
1e160 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
1e170 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
1e180 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
1e190 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
1e1a0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
1e1b0 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
1e1c0 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
1e1d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1e1e0 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
1e1f0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
1e200 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
1e210 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1e220 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
1e230 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
1e240 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
1e250 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
1e260 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
1e270 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
1e280 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
1e290 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
1e2a0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
1e2b0 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
1e2c0 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
1e2d0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
1e2e0 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
1e2f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
1e300 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
1e310 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
1e320 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1e330 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1e340 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
1e350 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1e360 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f  0x200, ("End pro
1e370 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1e380 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1e390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1e3a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e3b0 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1e3c0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1e3d0 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
1e3e0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
1e3f0 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
1e400 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1e410 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
1e420 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
1e430 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
1e440 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
1e450 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20   = 0;.  Bitmask 
1e460 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e  mPrior = 0;.  in
1e470 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73  t iTab;.  SrcLis
1e480 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
1e490 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
1e4a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e4b0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1e4c0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e4d0 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61  tem *pEnd = &pTa
1e4e0 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d  bList->a[pWInfo-
1e4f0 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69  >nLevel];.  sqli
1e500 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
1e510 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
1e520 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e530 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  OK;.  WhereLoop 
1e540 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f  *pNew;.  u8 prio
1e550 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a  rJointype = 0;..
1e560 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74    /* Loop over t
1e570 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
1e580 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74   join, from left
1e590 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70   to right */.  p
1e5a0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1e5b0 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  pNew;.  whereLoo
1e5c0 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66  pInit(pNew);.  f
1e5d0 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d  or(iTab=0, pItem
1e5e0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49  =pTabList->a; pI
1e5f0 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b  tem<pEnd; iTab++
1e600 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1e610 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
1e620 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  e = 0;.    pNew-
1e630 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  >iTab = iTab;.  
1e640 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66    pNew->maskSelf
1e650 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
1e660 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
1e670 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
1e680 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
1e690 66 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  f( ((pItem->fg.j
1e6a0 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69  ointype|priorJoi
1e6b0 6e 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46  ntype) & (JT_LEF
1e6c0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20  T|JT_CROSS))!=0 
1e6d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1e6e0 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
1e6f0 75 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73  ue when pItem is
1e700 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1e710 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20   term on the.   
1e720 20 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64     ** right-hand
1e730 2d 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20  -side of a LEFT 
1e740 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20  or CROSS JOIN.  
1e750 2a 2f 0a 20 20 20 20 20 20 6d 50 72 65 72 65 71  */.      mPrereq
1e760 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = mPrior;.    }
1e770 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79  .    priorJointy
1e780 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a  pe = pItem->fg.j
1e790 6f 69 6e 74 79 70 65 3b 0a 23 69 66 6e 64 65 66  ointype;.#ifndef
1e7a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e7b0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
1e7c0 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
1e7d0 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
1e7e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e7f0 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  _item *p;.      
1e800 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b  for(p=&pItem[1];
1e810 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
1e820 20 20 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73         if( mUnus
1e830 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a  able || (p->fg.j
1e840 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
1e850 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b  FT|JT_CROSS)) ){
1e860 0a 20 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73  .          mUnus
1e870 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57  able |= sqlite3W
1e880 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
1e890 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
1e8a0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
1e8b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e8c0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1e8d0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42 75  opAddVirtual(pBu
1e8e0 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1e8f0 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1e900 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
1e910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1e920 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  UALTABLE */.    
1e930 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1e940 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70  reLoopAddBtree(p
1e950 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1e960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1e970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e980 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
1e990 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69  reLoopAddOr(pBui
1e9a0 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1e9b0 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d  Unusable);.    }
1e9c0 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70  .    mPrior |= p
1e9d0 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  New->maskSelf;. 
1e9e0 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d     if( rc || db-
1e9f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1ea00 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  break;.  }..  wh
1ea10 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
1ea20 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
1ea30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
1ea40 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
1ea50 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
1ea60 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
1ea70 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
1ea80 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
1ea90 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
1eaa0 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
1eab0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1eac0 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
1ead0 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
1eae0 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
1eaf0 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
1eb00 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ration.  Return 
1eb10 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a  N:.** .**   N>0:
1eb20 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68     N terms of th
1eb30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1eb40 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1eb50 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74  **   N==0:  No t
1eb60 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1eb70 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
1eb80 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e  satisfied.**   N
1eb90 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65  <0:   Unknown ye
1eba0 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73  t how many terms
1ebb0 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67   of ORDER BY mig
1ebc0 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64 2e  ht be satisfied.
1ebd0 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74     .**.** Note t
1ebe0 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66  hat processing f
1ebf0 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  or WHERE_GROUPBY
1ec00 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49   and WHERE_DISTI
1ec10 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a  NCTBY is not as.
1ec20 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74 68  ** strict.  With
1ec30 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1ec40 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20  STINCT the only 
1ec50 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74  requirement is t
1ec60 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  hat.** equivalen
1ec70 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d  t rows appear im
1ec80 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65  mediately adjace
1ec90 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  nt to one anothe
1eca0 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20  r.  GROUP BY.** 
1ecb0 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20  and DISTINCT do 
1ecc0 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77 73  not require rows
1ecd0 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e   to appear in an
1ece0 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  y particular ord
1ecf0 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73  er as long.** as
1ed00 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
1ed10 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67   are grouped tog
1ed20 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72  ether.  Thus for
1ed30 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49   GROUP BY and DI
1ed40 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f  STINCT.** the pO
1ed50 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e  rderBy terms can
1ed60 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61   be matched in a
1ed70 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20  ny order.  With 
1ed80 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a  ORDER BY, the .*
1ed90 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73  * pOrderBy terms
1eda0 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65 64   must be matched
1edb0 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d   in strict left-
1edc0 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a  to-right order..
1edd0 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68 65  */.static i8 whe
1ede0 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f  rePathSatisfiesO
1edf0 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 49  rderBy(.  WhereI
1ee00 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
1ee10 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1ee20 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1ee30 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
1ee40 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
1ee50 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e  OUP BY or DISTIN
1ee60 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65  CT clause to che
1ee70 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  ck */.  WherePat
1ee80 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a  h *pPath,     /*
1ee90 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20 74   The WherePath t
1eea0 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36  o check */.  u16
1eeb0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
1eec0 20 20 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55     /* WHERE_GROU
1eed0 50 42 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54  PBY or _DISTINCT
1eee0 42 59 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c  BY or _ORDERBY_L
1eef0 49 4d 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  IMIT */.  u16 nL
1ef00 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
1ef10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1ef20 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61  ries in pPath->a
1ef30 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  Loop[] */.  Wher
1ef40 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20  eLoop *pLast,   
1ef50 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68    /* Add this Wh
1ef60 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65  ereLoop to the e
1ef70 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f  nd of pPath->aLo
1ef80 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  op[] */.  Bitmas
1ef90 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20  k *pRevMask     
1efa0 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
1efb0 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75  WhereLoops to ru
1efc0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1efd0 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65  er */.){.  u8 re
1efe0 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  vSet;           
1eff0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76 20   /* True if rev 
1f000 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38  is known */.  u8
1f010 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
1f020 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65      /* Composite
1f030 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1f040 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20 20   u8 revIdx;     
1f050 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1f060 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20  sort order */.  
1f070 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  u8 isOrderDistin
1f080 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69  ct;   /* All pri
1f090 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72  or WhereLoops ar
1f0a0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
1f0b0 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63   */.  u8 distinc
1f0c0 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54  tColumns;   /* T
1f0d0 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20  rue if the loop 
1f0e0 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e  has UNIQUE NOT N
1f0f0 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ULL columns */. 
1f100 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20   u8 isMatch;    
1f110 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d         /* iColum
1f120 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d  n matches a term
1f130 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1f140 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36   clause */.  u16
1f150 20 65 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20   eqOpMask;      
1f160 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71     /* Allowed eq
1f170 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73  uality operators
1f180 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
1f190 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
1f1a0 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
1f1b0 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
1f1c0 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b  /.  u16 nColumn;
1f1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1f1e0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64  al number of ord
1f1f0 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ered columns in 
1f200 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  the index */.  u
1f210 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
1f220 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
1f230 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
1f240 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1f250 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
1f260 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1f270 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
1f280 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
1f290 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
1f2a0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1f2b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1f2c0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f2e0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
1f2f0 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
1f300 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
1f310 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
1f320 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
1f330 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
1f340 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
1f350 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f  op *pLoop = 0; /
1f360 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
1f370 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
1f380 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54  sed. */.  WhereT
1f390 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1f3a0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
1f3b0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1f3c0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
1f3d0 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
1f3e0 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
1f3f0 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
1f400 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
1f410 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
1f420 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
1f430 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
1f440 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f450 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
1f460 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1f470 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
1f480 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
1f490 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
1f4a0 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
1f4b0 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
1f4c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1f4d0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
1f4e0 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
1f4f0 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
1f500 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
1f510 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
1f520 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
1f530 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
1f540 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
1f550 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
1f560 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
1f570 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c  ;  /* Mask of al
1f580 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c  l well-ordered l
1f590 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oops */.  Bitmas
1f5a0 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20  k ready;        
1f5b0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1f5c0 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
1f5d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  /*.  ** We sa
1f5e0 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
1f5f0 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20  is "one-row" if 
1f600 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20  it generates no 
1f610 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
1f620 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  ** row of output
1f630 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69  .  A WhereLoop i
1f640 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c  s one-row if all
1f650 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1f660 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
1f670 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
1f680 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
1f690 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
1f6a0 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
1f6b0 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
1f6c0 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65  e.  ** Any Where
1f6d0 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45  Loop with an WHE
1f6e0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e  RE_COLUMN_EQ con
1f6f0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72  straint on the r
1f700 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e  owid is one-row.
1f710 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d  .  ** Every one-
1f720 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  row WhereLoop wi
1f730 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52  ll have the WHER
1f740 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74  E_ONEROW bit set
1f750 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a   in wsFlags..  *
1f760 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
1f770 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
1f780 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20  order-distinct" 
1f790 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  if the set of co
1f7a0 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  lumns from.  ** 
1f7b0 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  that WhereLoop t
1f7c0 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f  hat are in the O
1f7d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1f7e0 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
1f7f0 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20   every.  ** row 
1f800 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
1f810 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  .  Every one-row
1f820 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75   WhereLoop is au
1f830 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
1f840 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
1f850 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74     A WhereLoop t
1f860 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d  hat has no colum
1f870 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ns in the ORDER 
1f880 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69  BY clause.  ** i
1f890 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
1f8a0 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65  inct. To be orde
1f8b0 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f  r-distinct is no
1f8c0 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65  t quite the same
1f8d0 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55   as being.  ** U
1f8e0 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e  NIQUE since a UN
1f8f0 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  IQUE column or i
1f900 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75  ndex can have mu
1f910 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74  ltiple rows that
1f920 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20   .  ** are NULL 
1f930 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  and NULL values 
1f940 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  are equivalent f
1f950 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
1f960 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  f order-distinct
1f970 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64  ..  ** To be ord
1f980 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65  er-distinct, the
1f990 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
1f9a0 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
1f9b0 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
1f9c0 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20  The rowid for a 
1f9d0 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
1f9e0 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
1f9f0 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20  ULL so whenever 
1fa00 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61  the.  ** rowid a
1fa10 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52  ppears in the OR
1fa20 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
1fa30 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1fa40 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20   WhereLoop is.  
1fa50 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1fa60 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
1fa70 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
1fa80 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
1fa90 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f    if( nLoop && O
1faa0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
1fab0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
1fac0 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
1fad0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f   return 0;..  nO
1fae0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1faf0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74  y->nExpr;.  test
1fb00 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d  case( nOrderBy==
1fb10 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  BMS-1 );.  if( n
1fb20 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
1fb30 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
1fb40 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
1fb50 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
1fb60 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
1fb70 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
1fb80 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
1fb90 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
1fba0 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
1fbb0 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20  sk = 0;.  ready 
1fbc0 3d 20 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20  = 0;.  eqOpMask 
1fbd0 3d 20 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20  = WO_EQ | WO_IS 
1fbe0 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69  | WO_ISNULL;.  i
1fbf0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
1fc00 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
1fc10 4d 49 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c  MIT ) eqOpMask |
1fc20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69  = WO_IN;.  for(i
1fc30 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44  Loop=0; isOrderD
1fc40 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74  istinct && obSat
1fc50 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70  <obDone && iLoop
1fc60 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  <=nLoop; iLoop++
1fc70 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70  ){.    if( iLoop
1fc80 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c  >0 ) ready |= pL
1fc90 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
1fca0 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f     if( iLoop<nLo
1fcb0 6f 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  op ){.      pLoo
1fcc0 70 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  p = pPath->aLoop
1fcd0 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69  [iLoop];.      i
1fce0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
1fcf0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
1fd00 4d 49 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  MIT ) continue;.
1fd10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fd20 20 70 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a   pLoop = pLast;.
1fd30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
1fd40 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1fd50 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1fd60 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
1fd70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Loop->u.vtab.isO
1fd80 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d  rdered ) obSat =
1fd90 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62   obDone;.      b
1fda0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fdb0 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  iCur = pWInfo->p
1fdc0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70  TabList->a[pLoop
1fdd0 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b  ->iTab].iCursor;
1fde0 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66  ..    /* Mark of
1fdf0 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74  f any ORDER BY t
1fe00 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61 20  erm X that is a 
1fe10 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
1fe20 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
1fe30 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66  e current loop f
1fe40 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
1fe50 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  s term in the WH
1fe60 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  ERE.    ** claus
1fe70 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  e of the form X 
1fe80 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74  IS NULL or X=? t
1fe90 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  hat reference on
1fea0 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  ly outer.    ** 
1feb0 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  loops..    */.  
1fec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
1fed0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
1fee0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
1fef0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
1ff00 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45  inue;.      pOBE
1ff10 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1ff20 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1ff30 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1ff40 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
1ff50 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  BExpr->op!=TK_CO
1ff60 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LUMN ) continue;
1ff70 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78  .      if( pOBEx
1ff80 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1ff90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ffa0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
1ffb0 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28  e3WhereFindTerm(
1ffc0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
1ffd0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
1ffe0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
20000 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30  ady, eqOpMask, 0
20010 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
20020 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
20030 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
20040 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
20050 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _IN ){.        /
20060 2a 20 49 4e 20 74 65 72 6d 73 20 61 72 65 20 6f  * IN terms are o
20070 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 73 6f  nly valid for so
20080 72 74 69 6e 67 20 69 6e 20 74 68 65 20 4f 52 44  rting in the ORD
20090 45 52 20 42 59 20 4c 49 4d 49 54 20 0a 20 20 20  ER BY LIMIT .   
200a0 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61       ** optimiza
200b0 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e 20 6f  tion, and then o
200c0 6e 6c 79 20 69 66 20 74 68 65 79 20 61 72 65 20  nly if they are 
200d0 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a 20 20  actually used.  
200e0 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20        ** by the 
200f0 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20  query plan */.  
20100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63        assert( wc
20110 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
20120 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29  _ORDERBY_LIMIT )
20130 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
20140 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  0; j<pLoop->nLTe
20150 72 6d 20 26 26 20 70 54 65 72 6d 21 3d 70 4c 6f  rm && pTerm!=pLo
20160 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a  op->aLTerm[j]; j
20170 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  ++){}.        if
20180 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  ( j>=pLoop->nLTe
20190 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rm ) continue;. 
201a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
201b0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
201c0 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
201d0 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d  )!=0 && pOBExpr-
201e0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
201f0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
20200 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20  r *z1, *z2;.    
20210 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
20220 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
20230 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
20240 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
20250 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
20260 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
20270 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
20280 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
20290 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
202a0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
202b0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
202c0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
202d0 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pTerm->pExpr);. 
202e0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
202f0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
20300 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
20310 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z2 = pColl->z
20320 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
20330 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
20340 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f  (z1, z2)!=0 ) co
20350 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20360 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
20370 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pExpr->op==TK_I
20380 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  S );.      }.   
20390 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
203a0 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  BIT(i);.    }.. 
203b0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
203c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
203d0 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20  NEROW)==0 ){.   
203e0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
203f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
20400 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  K ){.        pIn
20410 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
20420 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
20430 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
20440 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
20450 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f  f( (pIndex = pLo
20460 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
20470 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ex)==0 || pIndex
20480 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a  ->bUnordered ){.
20490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
204a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
204b0 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d         nKeyCol =
204c0 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
204d0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  ;.        nColum
204e0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  n = pIndex->nCol
204f0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  umn;.        ass
20500 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b  ert( nColumn==nK
20510 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52  eyCol+1 || !HasR
20520 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
20530 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ble) );.        
20540 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
20550 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
20560 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20  -1]==XN_ROWID.  
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52          || !HasR
20590 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61  owid(pIndex->pTa
205a0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ble));.        i
205b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
205c0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
205d0 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  Index);.      }.
205e0 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  .      /* Loop t
205f0 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d  hrough all colum
20600 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
20610 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74 68  and deal with th
20620 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  e ones.      ** 
20630 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e  that are not con
20640 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f  strained by == o
20650 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  r IN..      */. 
20660 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53 65       rev = revSe
20670 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73  t = 0;.      dis
20680 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30  tinctColumns = 0
20690 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
206a0 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29   j<nColumn; j++)
206b0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e  {.        u8 bOn
206c0 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65 20  ce = 1; /* True 
206d0 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45 52  to run the ORDER
206e0 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70 20   BY search loop 
206f0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  */..        asse
20700 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e  rt( j>=pLoop->u.
20710 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20 20 20  btree.nEq .     
20720 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70         || (pLoop
20730 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29 3d  ->aLTerm[j]==0)=
20740 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70  =(j<pLoop->nSkip
20750 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
20760 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70       if( j<pLoop
20770 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26 26  ->u.btree.nEq &&
20780 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70   j>=pLoop->nSkip
20790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 31   ){.          u1
207a0 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 61  6 eOp = pLoop->a
207b0 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61  LTerm[j]->eOpera
207c0 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  tor;..          
207d0 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20  /* Skip over == 
207e0 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e 55 4c  and IS and ISNUL
207f0 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f 20  L terms.  (Also 
20800 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77 68  skip IN terms wh
20810 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  en.          ** 
20820 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52 44 45  doing WHERE_ORDE
20830 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65 73  RBY_LIMIT proces
20840 73 69 6e 67 29 2e 20 0a 20 20 20 20 20 20 20 20  sing). .        
20850 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
20860 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
20870 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c 75 6d   term is a colum
20880 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29 20 49  n of an ((?,?) I
20890 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29 20 0a  N (SELECT...)) .
208a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
208b0 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68 69 63  ression for whic
208c0 68 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  h the SELECT ret
208d0 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
208e0 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ne column,.     
208f0 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74 68       ** check th
20900 61 74 20 69 74 20 69 73 20 74 68 65 20 6f 6e 6c  at it is the onl
20910 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 62 79  y column used by
20920 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74 68 65   this loop. Othe
20930 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20 20  rwise,.         
20940 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 6e 65   ** if it is one
20950 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 2c   of two or more,
20960 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c   none of the col
20970 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20 20 20  umns can be.    
20980 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65        ** conside
20990 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61 6e 20  red to match an 
209a0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e 20 20  ORDER BY term.  
209b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
209c0 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61 73 6b   (eOp & eqOpMask
209d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
209e0 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
209f0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
20a00 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
20a10 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
20a20 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
20a30 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
20a40 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
20a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20a60 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
20a70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
20a80 66 28 20 41 4c 57 41 59 53 28 65 4f 70 20 26 20  f( ALWAYS(eOp & 
20a90 57 4f 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20  WO_IN) ){.      
20aa0 20 20 20 20 20 20 2f 2a 20 41 4c 57 41 59 53 28        /* ALWAYS(
20ab0 29 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 3a  ) justification:
20ac0 20 65 4f 70 20 69 73 20 61 6e 20 65 71 75 61 6c   eOp is an equal
20ad0 69 74 79 20 6f 70 65 72 61 74 6f 72 20 64 75 65  ity operator due
20ae0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
20af0 20 20 20 20 2a 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e      ** j<pLoop->
20b00 75 2e 62 74 72 65 65 2e 6e 45 71 20 63 6f 6e 73  u.btree.nEq cons
20b10 74 72 61 69 6e 74 20 61 62 6f 76 65 2e 20 20 41  traint above.  A
20b20 6e 79 20 65 71 75 61 6c 69 74 79 20 6f 74 68 65  ny equality othe
20b30 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
20b40 20 74 68 61 6e 20 57 4f 5f 49 4e 20 69 73 20 63   than WO_IN is c
20b50 61 70 74 75 72 65 64 20 62 79 20 74 68 65 20 70  aptured by the p
20b60 72 65 76 69 6f 75 73 20 22 69 66 22 2e 20 20 53  revious "if".  S
20b70 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20 20 20  o this one.     
20b80 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
20b90 20 68 61 73 20 74 6f 20 62 65 20 57 4f 5f 49 4e   has to be WO_IN
20ba0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
20bb0 20 45 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f 6f   Expr *pX = pLoo
20bc0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45  p->aLTerm[j]->pE
20bd0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
20be0 20 66 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c   for(i=j+1; i<pL
20bf0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
20c00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20c10 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
20c20 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70  >aLTerm[i]->pExp
20c30 72 3d 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20  r==pX ){.       
20c40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
20c50 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b   (pLoop->aLTerm[
20c60 69 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  i]->eOperator & 
20c70 57 4f 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20  WO_IN) );.      
20c80 20 20 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20            bOnce 
20c90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
20ca0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20cb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20cc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20ce0 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
20cf0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
20d00 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28  r in the table (
20d10 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72  iColumn) and sor
20d20 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  t order.        
20d30 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20  ** (revIdx) for 
20d40 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20  the j-th column 
20d50 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
20d60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
20d70 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
20d80 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
20d90 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
20da0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
20db0 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65    revIdx = pInde
20dc0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  x->aSortOrder[j]
20dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20de0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
20df0 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
20e00 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
20e10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20e20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
20e30 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20  = XN_ROWID;.    
20e40 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30        revIdx = 0
20e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
20e60 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e       /* An uncon
20e70 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20  strained column 
20e80 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55  that might be NU
20e90 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
20ea0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68  is.        ** Wh
20eb0 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77  ereLoop is not w
20ec0 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20  ell-ordered.    
20ed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
20ee0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
20ef0 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ct.         && i
20f00 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20  Column>=0.      
20f10 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e     && j>=pLoop->
20f20 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
20f30 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e       && pIndex->
20f40 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
20f50 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
20f60 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
20f70 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
20f80 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
20f90 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
20fa0 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20   Find the ORDER 
20fb0 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72  BY term that cor
20fc0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
20fd0 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  j-th column.    
20fe0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
20ff0 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  dex and mark tha
21000 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
21010 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
21020 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
21030 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
21040 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69  (i=0; bOnce && i
21050 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
21060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d  .          if( M
21070 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
21080 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
21090 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20          pOBExpr 
210a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
210b0 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
210c0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
210d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
210e0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
210f0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
21100 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
21110 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
21120 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
21130 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  TBY );.         
21140 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
21150 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42   & (WHERE_GROUPB
21160 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  Y|WHERE_DISTINCT
21170 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20  BY))==0 ) bOnce 
21180 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
21190 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29  f( iColumn>=(-1)
211a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
211b0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
211c0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
211d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
211e0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
211f0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
21200 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
21210 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
21220 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
21230 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
21240 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21250 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21260 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
21270 72 65 28 70 4f 42 45 78 70 72 2c 70 49 6e 64 65  re(pOBExpr,pInde
21280 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a  x->aColExpr->a[j
21290 5d 2e 70 45 78 70 72 2c 69 43 75 72 29 20 29 7b  ].pExpr,iCur) ){
212a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
212b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
212c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
212d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
212e0 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
212f0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
21300 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
21310 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
21320 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
21330 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
21340 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
21350 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
21360 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
21370 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
21380 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
21390 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
213a0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
213b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
213c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
213d0 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
213e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
213f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21400 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
21410 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
21420 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
21430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
21440 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
21450 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
21460 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
21470 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
21480 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
21490 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
214a0 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
214b0 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
214c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
214d0 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
214e0 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
214f0 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
21500 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
21510 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
21520 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21530 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
21540 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
21550 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
21560 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
21570 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
21580 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
21590 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
215a0 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
215b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
215c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
215d0 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
215e0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
215f0 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a  mn==XN_ROWID ){.
21600 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21610 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
21620 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
21630 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
21640 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
21650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21660 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
21670 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
21680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21690 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
216a0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
216b0 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
216c0 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
216d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
216e0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
216f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
21700 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
21710 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21720 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
21730 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
21740 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
21750 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
21760 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
21770 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
21780 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
21790 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
217a0 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
217b0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
217c0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
217d0 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
217e0 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
217f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
21800 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
21810 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
21820 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
21830 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
21840 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
21850 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
21860 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
21870 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
21880 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
21890 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
218a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
218b0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
218c0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
218d0 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
218e0 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
218f0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
21900 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
21910 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
21920 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
21930 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f  xprUsage(&pWInfo
21940 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
21950 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
21960 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
21970 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
21980 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21990 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
219a0 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
219b0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
219c0 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
219d0 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
219e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
219f0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
21a00 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
21a10 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
21a20 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
21a30 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
21a40 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
21a50 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
21a60 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
21a70 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
21a80 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
21a90 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
21aa0 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
21ab0 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
21ac0 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
21ad0 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
21ae0 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
21af0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21b00 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
21b10 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
21b20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
21b30 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
21b40 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
21b50 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21b60 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
21b70 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
21b80 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
21b90 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
21ba0 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
21bb0 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
21bc0 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
21bd0 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
21be0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
21bf0 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
21c00 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
21c10 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
21c20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
21c30 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
21c40 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
21c50 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
21c60 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
21c70 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
21c80 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
21c90 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
21ca0 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
21cb0 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
21cc0 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
21cd0 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
21ce0 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
21cf0 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
21d00 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
21d10 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
21d20 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
21d30 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
21d40 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
21d50 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
21d60 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
21d70 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
21d80 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
21d90 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
21da0 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
21db0 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
21dc0 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
21dd0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
21de0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
21df0 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
21e00 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
21e10 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
21e20 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
21e30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
21e40 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
21e50 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
21e60 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
21e70 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
21e80 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
21e90 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
21ea0 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
21eb0 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
21ec0 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
21ed0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
21ee0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
21ef0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
21f00 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
21f10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
21f20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
21f30 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
21f40 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
21f50 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
21f60 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
21f70 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
21f80 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
21f90 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
21fa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
21fb0 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
21fc0 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
21fd0 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
21fe0 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
21ff0 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
22000 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
22010 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
22020 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
22030 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
22040 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
22050 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
22060 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
22070 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
22080 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
22090 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
220a0 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
220b0 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
220c0 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20   rows, assuming 
220d0 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61  that the keys ha
220e0 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20  ve .** nOrderby 
220f0 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74  columns and that
22100 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74   the first nSort
22110 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
22120 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64  lready in.** ord
22130 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  er..*/.static Lo
22140 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e  gEst whereSortin
22150 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e  gCost(.  WhereIn
22160 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f  fo *pWInfo,.  Lo
22170 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74  gEst nRow,.  int
22180 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74   nOrderBy,.  int
22190 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a   nSorted.){.  /*
221a0 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
221b0 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c  ed cost of a ful
221c0 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c  l external sort,
221d0 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a   where N is .  *
221e0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
221f0 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a  rows to sort is:
22200 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
22210 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
22220 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20  og(N))..  ** .  
22230 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72  ** Or, if the or
22240 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61  der-by clause ha
22250 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e  s X terms but on
22260 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20  ly the last Y . 
22270 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
22280 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
22290 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
222a0 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
222b0 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
222c0 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
222d0 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
222e0 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59  N * log(N)) * (Y
222f0 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  /X).  **.  ** Th
22300 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
22310 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
22320 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
22330 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c   rScale.  ** bel
22340 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ow.  */.  LogEst
22350 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
22360 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
22370 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
22380 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
22390 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d  0) );.  rScale =
223a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
223b0 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64  nOrderBy-nSorted
223c0 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
223d0 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73  - 66;.  rSortCos
223e0 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c  t = nRow + rScal
223f0 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75  e + 16;..  /* Mu
22400 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29  ltiple by log(M)
22410 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20   where M is the 
22420 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
22430 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20   rows..  ** Use 
22440 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20  the LIMIT for M 
22450 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72  if it is smaller
22460 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66   */.  if( (pWInf
22470 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
22480 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
22490 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69  !=0 && pWInfo->i
224a0 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20  Limit<nRow ){.  
224b0 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d    nRow = pWInfo-
224c0 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  >iLimit;.  }.  r
224d0 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c  SortCost += estL
224e0 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75  og(nRow);.  retu
224f0 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a  rn rSortCost;.}.
22500 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
22510 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
22520 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
22530 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
22540 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
22550 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
22560 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
22570 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
22580 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
22590 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
225a0 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
225b0 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
225c0 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
225d0 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
225e0 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
225f0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
22600 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
22610 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
22620 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
22630 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
22640 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
22650 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
22660 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
22670 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
22680 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
22690 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
226a0 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
226b0 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
226c0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
226d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
226e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
226f0 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
22700 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c  eInfo *pWInfo, L
22710 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  ogEst nRowEst){.
22720 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
22730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22740 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
22750 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
22760 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
22770 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
22780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22790 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
227a0 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
227b0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
227c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
227d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
227e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
227f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22800 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
22810 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
22820 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
22830 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22840 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
22850 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
22860 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22880 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
22890 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30  */.  int mxI = 0
228a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
228b0 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
228c0 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65  entry to replace
228d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
228e0 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
228f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
22900 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
22910 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ms */.  LogEst m
22920 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
22930 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
22940 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
22950 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
22960 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20  mxUnsorted = 0; 
22970 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e     /* Maximum un
22980 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61  sorted cost of a
22990 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a   set of path */.
229a0 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
229b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
229c0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
229d0 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
229e0 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
229f0 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
22a00 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
22a10 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
22a20 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
22a30 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
22a40 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
22a50 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
22a60 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
22a70 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
22a80 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
22a90 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
22aa0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
22ab0 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
22ac0 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
22ad0 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
22ae0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
22af0 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
22b00 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
22b10 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
22b20 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
22b30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
22b40 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
22b50 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
22b60 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
22b70 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
22b80 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
22b90 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
22ba0 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43    LogEst *aSortC
22bb0 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ost = 0;    /* S
22bc0 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69  orting and parti
22bd0 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73  al sorting costs
22be0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
22bf0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
22c00 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
22c10 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
22c20 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
22c30 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
22c40 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
22c50 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
22c60 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f  ted at pSpace */
22c70 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
22c80 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
22c90 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22ca0 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
22cb0 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
22cc0 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
22cd0 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
22ce0 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
22cf0 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
22d00 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
22d10 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
22d20 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
22d30 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
22d40 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
22d50 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
22d60 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
22d70 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
22d80 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p<=1) ? 1 : (nLo
22d90 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
22da0 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
22db0 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
22dc0 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
22dd0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
22de0 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
22df0 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25  ver.  (nRowEst=%
22e00 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  d)\n", nRowEst))
22e10 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45  ;..  /* If nRowE
22e20 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  st is zero and t
22e30 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
22e40 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f   BY clause, igno
22e50 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20  re it. In this. 
22e60 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72   ** case the pur
22e70 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
22e80 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65  l is to estimate
22e90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
22ea0 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  ows returned.  *
22eb0 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c  * by the overall
22ec0 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69   query. Once thi
22ed0 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62  s estimate has b
22ee0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
22ef0 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69  e caller.  ** wi
22f00 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
22f10 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  unction a second
22f20 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74   time, passing t
22f30 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74  he estimate as t
22f40 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20  he.  ** nRowEst 
22f50 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
22f60 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
22f70 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
22f80 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  Est==0 ){.    nO
22f90 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
22fa0 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  lse{.    nOrderB
22fb0 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
22fc0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
22fd0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
22fe0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
22ff0 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46  pace for aTo, aF
23000 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73  rom and aSortCos
23010 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20  t[] */.  nSpace 
23020 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
23030 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
23040 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
23050 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70  xChoice*2;.  nSp
23060 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  ace += sizeof(Lo
23070 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
23080 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
23090 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
230a0 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  N(db, nSpace);. 
230b0 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
230c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
230d0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f  OMEM_BKPT;.  aTo
230e0 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
230f0 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
23100 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
23110 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
23120 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
23130 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
23140 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
23150 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
23160 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
23170 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
23180 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
23190 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
231a0 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
231b0 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
231c0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
231d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
231e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
231f0 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
23200 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
23210 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
23220 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
23230 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
23240 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
23250 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
23260 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
23270 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
23280 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
23290 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
232a0 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
232b0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
232c0 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
232d0 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
232e0 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
232f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
23300 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
23310 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
23320 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
23330 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
23340 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
23350 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
23360 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
23370 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
23380 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
23390 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
233a0 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
233b0 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
233c0 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
233d0 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
233e0 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
233f0 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
23400 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
23410 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
23420 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
23430 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
23440 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
23450 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
23460 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
23470 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
23480 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
23490 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
234a0 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20  s go above 28.  
234b0 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
234c0 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
234d0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
234e0 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
234f0 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
23500 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 28.  ** rows,
23510 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
23520 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
23530 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
23540 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
23550 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
23560 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28  p, 48);  assert(
23570 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   48==sqlite3LogE
23580 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f  st(28) );.  nFro
23590 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
235a0 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
235b0 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
235c0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
235d0 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
235e0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
235f0 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
23600 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
23610 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
23620 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
23630 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
23640 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
23650 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
23660 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
23670 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
23680 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
23690 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
236a0 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
236b0 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
236c0 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
236d0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
236e0 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
236f0 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
23700 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
23710 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
23720 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
23730 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
23740 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
23750 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
23760 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
23770 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
23780 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
23790 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
237a0 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
237b0 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
237c0 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
237d0 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
237e0 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
237f0 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
23800 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
23810 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
23820 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
23830 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
23840 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
23850 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
23860 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
23870 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
23880 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
23890 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
238a0 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
238b0 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
238c0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
238d0 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
238e0 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
238f0 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
23900 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
23910 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
23920 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23940 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
23950 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
23960 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
23970 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
23980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
23990 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
239a0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
239b0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
239c0 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
239d0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
239e0 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
239f0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
23a00 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
23a10 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
23a20 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
23a30 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
23a40 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
23a50 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
23a60 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
23a70 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
23a80 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
23a90 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
23aa0 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
23ab0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23ac0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
23ad0 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
23ae0 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
23af0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
23b00 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
23b10 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
23b20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
23b30 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
23b40 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
23b50 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
23b60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
23b70 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46  if( (pWLoop->wsF
23b80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
23b90 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
23ba0 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b  From->nRow<10 ){
23bb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
23bc0 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f   not use an auto
23bd0 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74  matic index if t
23be0 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  he this loop is 
23bf0 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20  expected.       
23c00 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73     ** to run les
23c10 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e 20  s than 2 times. 
23c20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
23c30 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
23c40 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
23c50 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
23c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23c70 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
23c80 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
23c90 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
23ca0 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
23cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
23cc0 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
23cd0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
23ce0 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  d = sqlite3LogEs
23cf0 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65  tAdd(pWLoop->rSe
23d00 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  tup,pWLoop->rRun
23d10 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b   + pFrom->nRow);
23d20 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
23d30 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
23d40 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
23d50 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65   pFrom->rUnsorte
23d60 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  d);.        nOut
23d70 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
23d80 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
23d90 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
23da0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
23db0 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
23dc0 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
23dd0 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a   isOrdered<0 ){.
23de0 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
23df0 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53  red = wherePathS
23e00 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
23e10 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23e30 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
23e40 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
23e50 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
23e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e70 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
23e80 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  , &revMask);.   
23e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23ea0 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20        revMask = 
23eb0 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
23ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ed0 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e    if( isOrdered>
23ee0 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c  =0 && isOrdered<
23ef0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
23f00 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 43        if( aSortC
23f10 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d  ost[isOrdered]==
23f20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23f30 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
23f40 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72  ered] = whereSor
23f50 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20  tingCost(.      
23f60 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
23f70 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65  , nRowEst, nOrde
23f80 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20  rBy, isOrdered. 
23f90 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
23fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23fb0 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
23fc0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e  te3LogEstAdd(rUn
23fd0 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73  sorted, aSortCos
23fe0 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a  t[isOrdered]);..
23ff0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
24000 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20  RACE(0x002,.    
24010 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d            ("----
24020 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20   sort cost=%-3d 
24030 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65  (%d/%d) increase
24040 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d  s cost %3d to %-
24050 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3d\n",.         
24060 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
24070 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72  isOrdered], (nOr
24080 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29  derBy-isOrdered)
24090 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  , nOrderBy, .   
240a0 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e 73              rUns
240b0 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a  orted, rCost));.
240c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
240d0 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
240e0 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
240f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
24100 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
24110 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20  f pWLoop should 
24120 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
24130 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  set of.        *
24140 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d  * mxChoice best-
24150 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20  so-far paths..  
24160 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
24170 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66   ** First look f
24180 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  or an existing p
24190 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73  ath among best-s
241a0 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20 20  o-far paths.    
241b0 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65      ** that cove
241c0 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  rs the same set 
241d0 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
241e0 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65   the same isOrde
241f0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  red.        ** s
24200 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63 75  etting as the cu
24210 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69  rrent path candi
24220 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  date..        **
24230 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
24240 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f  term "((pTo->isO
24250 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
24260 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65  )&0x80)==0" is e
24270 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
24280 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73    ** to (pTo->is
24290 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d  Ordered==(-1))==
242a0 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  (isOrdered==(-1)
242b0 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  )" for the range
242c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c  .        ** of l
242d0 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20  egal values for 
242e0 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36  isOrdered, -1..6
242f0 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  4..        */.  
24300 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
24310 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
24320 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
24330 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
24340 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
24350 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
24360 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  & ((pTo->isOrder
24370 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
24380 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  80)==0.         
24390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
243a0 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
243b0 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
243c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
243d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
243e0 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
243f0 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
24400 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20   /* None of the 
24410 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f  existing best-so
24420 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63 68  -far paths match
24430 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
24440 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
24450 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20   nTo>=mxChoice. 
24460 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43            && (rC
24470 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72  ost>mxCost || (r
24480 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
24490 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73  rUnsorted>=mxUns
244a0 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20 20  orted)).        
244b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
244c0 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
244d0 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20  candidate is no 
244e0 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20  better than any 
244f0 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
24500 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
24510 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69  aths currently i
24520 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61  n the best-so-fa
24530 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69  r buffer.  So di
24540 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20 20  scard.          
24550 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64    ** this candid
24560 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c  ate as not viabl
24570 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
24580 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
24590 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
245a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
245b0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
245c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
245d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
245e0 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
245f0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
24600 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
24610 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
24620 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
24630 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
24640 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24660 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
24670 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
24680 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
24690 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
246a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
246b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
246c0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
246d0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73  each this points
246e0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
246f0 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65  he new candidate
24700 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
24710 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  ** needs to be a
24720 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
24730 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  of best-so-far p
24740 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  aths. */.       
24750 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
24760 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
24770 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
24780 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
24790 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
247a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
247b0 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
247c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
247d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
247e0 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
247f0 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
24800 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
24810 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
24820 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
24830 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24840 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
24850 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
24860 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
24870 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
24880 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
24890 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
248a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
248b0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
248c0 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
248d0 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
248e0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
248f0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
24900 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
24910 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
24920 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
24930 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
24940 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
24950 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
24960 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
24970 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
24990 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
249a0 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  e if best-so-far
249b0 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a   path pTo=aTo[jj
249c0 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20  ] covers the.   
249d0 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73         ** same s
249e0 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
249f0 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72  has the sam isOr
24a00 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61 73  dered setting as
24a10 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
24a20 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  * candidate path
24a30 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
24a40 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
24a50 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a   should replace.
24a60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
24a70 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64 69   or if the candi
24a80 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73  date should be s
24a90 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20  kipped */.      
24aa0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
24ab0 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f  st<rCost || (pTo
24ac0 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26  ->rCost==rCost &
24ad0 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75  & pTo->nRow<=nOu
24ae0 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  t) ){.#ifdef WHE
24af0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
24b00 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
24b10 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24b20 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
24b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24b40 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24b50 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
24b60 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
24b70 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
24b80 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
24ba0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
24bb0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
24bc0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24be0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
24bf0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
24c00 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
24c10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24c20 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
24c30 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72   cost=%-3d,%d or
24c40 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
24c60 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
24c70 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
24c80 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
24c90 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
24ca0 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
24cb0 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
24cc0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
24cd0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
24ce0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
24cf0 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64        /* Discard
24d00 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
24d10 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72  ath from further
24d20 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
24d30 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  /.            te
24d40 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
24d50 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
24d60 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
24d70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
24d80 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
24d90 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
24da0 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
24db0 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
24dc0 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74  eaches here if t
24dd0 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
24de0 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  h is better than
24df0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
24e00 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70  * pTo path.  Rep
24e10 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68  lace pTo with th
24e20 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
24e30 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
24e40 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
24e50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
24e60 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
24e70 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
24e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
24e90 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
24ea0 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
24eb0 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  te %s cost=%-3d,
24ec0 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
24ee0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
24ef0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
24f00 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
24f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24f20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
24f30 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
24f40 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
24f50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24f60 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
24f70 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
24f80 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
24f90 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
24fa0 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
24fb0 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
24fc0 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
24fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24fe0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
24ff0 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
25000 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
25010 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
25020 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
25030 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
25040 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
25050 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
25060 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
25070 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
25080 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
25090 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
250a0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
250b0 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
250c0 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
250d0 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
250e0 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
250f0 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
25100 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
25110 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73  rUnsorted = rUns
25120 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70  orted;.        p
25130 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
25140 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
25150 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
25160 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
25170 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
25180 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
25190 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
251a0 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
251b0 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
251c0 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
251d0 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
251e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
251f0 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
25200 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
25210 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30  Unsorted = aTo[0
25220 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ].nRow;.        
25230 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d    for(jj=1, pTo=
25240 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68  &aTo[1]; jj<mxCh
25250 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  oice; jj++, pTo+
25260 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
25270 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d  if( pTo->rCost>m
25280 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20  xCost .         
25290 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f      || (pTo->rCo
252a0 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
252b0 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55  o->rUnsorted>mxU
252c0 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20  nsorted) .      
252d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
252e0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
252f0 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
25300 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
25310 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73  rted = pTo->rUns
25320 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  orted;.         
25330 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
25340 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
25350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25360 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25370 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
25380 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20  ACE_ENABLED  /* 
25390 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  >=2 */.    if( s
253a0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
253b0 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20   & 0x02 ){.     
253c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
253d0 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
253e0 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
253f0 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
25400 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
25410 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
25420 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
25430 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25440 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
25450 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
25460 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
25470 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
25480 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
25490 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
254a0 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
254b0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
254c0 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69  red>=0 ? (pTo->i
254d0 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20  sOrdered+'0') : 
254e0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
254f0 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
25500 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
25510 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25520 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
25530 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
25540 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
25550 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
25560 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25570 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
25580 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
25590 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
255a0 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
255b0 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
255c0 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
255d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
255e0 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
255f0 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
25600 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
25610 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
25620 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
25630 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
25640 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25650 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
25660 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
25670 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
25680 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
25690 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
256a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
256b0 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
256c0 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
256d0 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
256e0 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
256f0 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
25700 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
25710 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
25720 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
25730 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
25740 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
25750 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
25760 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
25770 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
25780 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
25790 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
257a0 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
257b0 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
257c0 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
257d0 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
257e0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
257f0 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
25800 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
25810 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
25820 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
25830 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
25840 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
25850 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
25860 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
25870 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
25880 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
25890 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
258a0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
258b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
258c0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
258d0 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
258e0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
258f0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
25900 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
25910 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
25920 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
25930 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
25940 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
25950 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
25960 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
25970 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
25980 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
25990 44 69 73 74 69 6e 63 74 53 65 74 2c 20 70 46 72  DistinctSet, pFr
259a0 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
259b0 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49       WHERE_DISTI
259c0 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  NCTBY, nLoop-1, 
259d0 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
259e0 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29  op-1], &notUsed)
259f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57  ;.    if( rc==pW
25a00 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53  Info->pDistinctS
25a10 65 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  et->nExpr ){.   
25a20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
25a30 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
25a40 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
25a50 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
25a60 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
25a70 29 7b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ){.    if( pWInf
25a80 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
25a90 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
25aa0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
25ab0 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d  rom->isOrdered==
25ac0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
25ad0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
25ae0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
25af0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
25b00 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
25b10 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
25b20 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
25b30 6e 4f 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e  nOBSat = pFrom->
25b40 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
25b50 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
25b60 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f   = pFrom->revLoo
25b70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  p;.      if( pWI
25b80 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29  nfo->nOBSat<=0 )
25b90 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  {.        pWInfo
25ba0 2d 3e 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20  ->nOBSat = 0;.  
25bb0 20 20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e        if( nLoop>
25bc0 30 20 26 26 20 28 70 46 72 6f 6d 2d 3e 61 4c 6f  0 && (pFrom->aLo
25bd0 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46  op[nLoop-1]->wsF
25be0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
25bf0 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ROW)==0 ){.     
25c00 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
25c10 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
25c20 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
25c30 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
25c40 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
25c50 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
25c60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25c70 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52          WHERE_OR
25c80 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f  DERBY_LIMIT, nLo
25c90 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
25ca0 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29  op[nLoop-1], &m)
25cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25cc0 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  rc==pWInfo->pOrd
25cd0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
25ce0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
25cf0 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
25d00 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  Loop = 1;.      
25d10 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
25d20 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20  vMask = m;.     
25d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25d50 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
25d60 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
25d70 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
25d80 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
25d90 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
25da0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
25db0 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20  pr && nLoop>0.  
25dc0 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
25dd0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
25de0 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
25df0 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
25e00 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
25e10 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
25e20 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
25e30 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
25e40 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
25e50 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76  p[nLoop-1], &rev
25e60 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Mask.      );.  
25e70 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
25e80 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
25e90 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65  .      if( nOrde
25ea0 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r==pWInfo->pOrde
25eb0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
25ec0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f        pWInfo->so
25ed0 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rted = 1;.      
25ee0 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
25ef0 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  k = revMask;.   
25f00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
25f10 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
25f20 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
25f30 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
25f40 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
25f50 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
25f60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
25f70 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
25f80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25f90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
25fa0 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f  st queries use o
25fb0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
25fc0 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74  le (they are not
25fd0 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65   joins) and have
25fe0 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f  .** simple == co
25ff0 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
26000 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73  t indexed fields
26010 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
26020 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70  attempts.** to p
26030 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65  lan those simple
26040 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63   cases using muc
26050 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20  h less ceremony 
26060 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65  than the.** gene
26070 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
26080 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74  y planner, and t
26090 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73  hereby yield fas
260a0 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ter sqlite3_prep
260b0 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66  are().** times f
260c0 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
260d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
260e0 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63   non-zero on suc
260f0 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75  cess, if this qu
26100 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ery can be handl
26110 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f  ed by this.** no
26120 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c  -frills query pl
26130 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a  anner.  Return z
26140 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72  ero if this quer
26150 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20  y needs the .** 
26160 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
26170 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a  query planner..*
26180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26190 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65  reShortCut(Where
261a0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
261b0 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
261c0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73  nfo *pWInfo;.  s
261d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
261e0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65  em *pItem;.  Whe
261f0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
26200 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
26210 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  m;.  WhereLoop *
26220 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75  pLoop;.  int iCu
26230 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  r;.  int j;.  Ta
26240 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
26250 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49  ex *pIdx;..  pWI
26260 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
26270 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57  pWInfo;.  if( pW
26280 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
26290 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
262a0 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e 20 30  LAUSE ) return 0
262b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
262c0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
262d0 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
262e0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
262f0 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
26300 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
26310 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
26320 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
26330 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
26340 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 72 65  isIndexedBy ) re
26350 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d  turn 0;.  iCur =
26360 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
26370 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
26380 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d  ->sWC;.  pLoop =
26390 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
263a0 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
263b0 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  s = 0;.  pLoop->
263c0 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65  nSkip = 0;.  pTe
263d0 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
263e0 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  eFindTerm(pWC, i
263f0 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
26400 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69  Q|WO_IS, 0);.  i
26410 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
26420 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
26430 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
26440 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  IS );.    pLoop-
26450 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
26460 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
26470 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  _IPK|WHERE_ONERO
26480 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c  W;.    pLoop->aL
26490 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
264a0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  .    pLoop->nLTe
264b0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f  rm = 1;.    pLoo
264c0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
264d0 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e   1;.    /* TUNIN
264e0 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77  G: Cost of a row
264f0 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20  id lookup is 10 
26500 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  */.    pLoop->rR
26510 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d  un = 33;  /* 33=
26520 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
26530 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  0) */.  }else{. 
26540 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
26550 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
26560 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
26570 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 4d  ){.      int opM
26580 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ask;.      asser
26590 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  t( pLoop->aLTerm
265a0 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c  Space==pLoop->aL
265b0 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  Term );.      if
265c0 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  ( !IsUniqueIndex
265d0 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c  (pIdx).       ||
265e0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
265f0 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20  here!=0 .       
26600 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  || pIdx->nKeyCol
26610 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70  >ArraySize(pLoop
26620 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a  ->aLTermSpace) .
26630 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65        ) continue
26640 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d  ;.      opMask =
26650 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
26660 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  ll ? (WO_EQ|WO_I
26670 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20  S) : WO_EQ;.    
26680 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
26690 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
266a0 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
266b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
266c0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
266d0 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20  , j, 0, opMask, 
266e0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
266f0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
26700 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65 73  eak;.        tes
26710 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
26720 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
26730 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
26740 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54  ->aLTerm[j] = pT
26750 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
26760 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e     if( j!=pIdx->
26770 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e  nKeyCol ) contin
26780 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ue;.      pLoop-
26790 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
267a0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
267b0 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e  _ONEROW|WHERE_IN
267c0 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28  DEXED;.      if(
267d0 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e   pIdx->isCoverin
267e0 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c  g || (pItem->col
267f0 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
26800 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30  nIndex(pIdx))==0
26810 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   ){.        pLoo
26820 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
26830 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
26840 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
26850 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20  p->nLTerm = j;. 
26860 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
26870 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20  ree.nEq = j;.   
26880 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
26890 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
268a0 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
268b0 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71  : Cost of a uniq
268c0 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ue index lookup 
268d0 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70  is 15 */.      p
268e0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b  Loop->rRun = 39;
268f0 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33    /* 39==sqlite3
26900 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20  LogEst(15) */.  
26910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26920 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
26930 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
26940 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
26950 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57  LogEst)1;.    pW
26960 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
26970 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
26980 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
26990 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
269a0 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
269b0 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
269c0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
269d0 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a  iTabCur = iCur;.
269e0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
269f0 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Out = 1;.    if(
26a00 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
26a10 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
26a20 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  at =  pWInfo->pO
26a30 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
26a40 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
26a50 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26a60 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
26a70 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
26a80 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
26a90 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
26aa0 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  UE;.    }.#ifdef
26ab0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26ac0 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27    pLoop->cId = '
26ad0 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0';.#endif.    r
26ae0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
26af0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
26b00 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
26b10 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
26b20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
26b30 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
26b40 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
26b50 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
26b60 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
26b70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
26b80 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
26b90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
26ba0 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
26bb0 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
26bc0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
26bd0 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
26be0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
26bf0 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
26c00 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
26c10 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
26c20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
26c30 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
26c40 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
26c50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
26c60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
26c70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
26c80 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
26c90 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
26ca0 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
26cb0 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
26cc0 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
26cd0 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
26ce0 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
26cf0 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
26d00 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
26d10 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
26d20 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
26d30 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
26d40 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
26d50 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
26d60 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
26d70 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
26d80 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
26d90 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
26da0 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
26db0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
26dc0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
26dd0 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
26de0 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
26df0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
26e00 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
26e10 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
26e20 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
26e30 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
26e40 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
26e50 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
26e60 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
26e70 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
26e80 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
26e90 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
26ea0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
26eb0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
26ec0 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
26ed0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
26ee0 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
26f10 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
26f20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f40 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
26f50 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
26f60 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
26f70 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
26f80 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
26f90 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
26fa0 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
26fb0 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
26fc0 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
26fd0 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
26fe0 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
26ff0 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
27000 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
27010 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
27020 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
27030 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
27040 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
27050 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
27060 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
27070 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
27080 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
27090 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
270a0 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
270b0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
270c0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
270d0 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
270e0 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
270f0 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
27100 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
27110 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
27120 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
27130 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
27140 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
27150 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
27160 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
27170 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
27180 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
27190 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
271a0 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
271b0 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
271c0 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
271d0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
271e0 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
271f0 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
27200 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
27210 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
27220 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
27230 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
27240 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
27250 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
27260 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
27270 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
27280 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
27290 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
272a0 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
272b0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
272c0 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
272d0 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
272e0 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
272f0 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
27300 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
27310 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
27320 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
27330 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
27340 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
27350 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
27360 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
27370 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
27380 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27390 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
273a0 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
273b0 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
273c0 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
273d0 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
273e0 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
273f0 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
27400 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
27410 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
27420 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
27430 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
27440 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
27450 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
27460 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
27470 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
27480 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
27490 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
274a0 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
274b0 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
274c0 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
274d0 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
274e0 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
274f0 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
27500 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
27510 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
27520 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
27530 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
27540 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
27550 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
27560 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
27570 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
27580 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
27590 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
275a0 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
275b0 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
275c0 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
275d0 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
275e0 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
275f0 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
27600 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
27610 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
27620 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
27630 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
27640 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
27650 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
27660 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
27670 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
27680 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
27690 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
276a0 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
276b0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
276c0 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
276d0 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
276e0 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
276f0 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
27700 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
27710 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
27720 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
27730 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
27740 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
27750 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
27760 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70  OCESSING.**.** p
27770 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
27780 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
27790 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20  R BY clause (or 
277a0 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
277b0 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  use.** if the WH
277c0 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
277d0 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c   is set in wctrl
277e0 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45  Flags) of a SELE
277f0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
27800 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
27810 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
27820 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27830 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
27840 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
27850 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
27860 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
27870 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
27880 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
27890 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61  * The iIdxCur pa
278a0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63  rameter is the c
278b0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
278c0 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a  an index.  If .*
278d0 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
278e0 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49 64  AUSE is set, iId
278f0 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
27900 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
27910 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
27920 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
27930 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
27940 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
27950 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
27960 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
27970 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
27980 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
27990 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
279a0 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
279b0 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
279c0 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
279d0 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
279e0 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
279f0 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
27a00 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
27a10 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
27a20 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
27a30 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
27a40 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
27a50 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27a60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27a70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
27a80 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
27a90 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
27aa0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a  TabList,      /*
27ab0 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
27ac0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
27ad0 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
27ae0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
27af0 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  re,           /*
27b00 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
27b10 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
27b20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
27b30 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f  * An ORDER BY (o
27b40 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
27b50 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
27b60 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
27b70 69 6e 63 74 53 65 74 2c 20 2f 2a 20 54 72 79 20  inctSet, /* Try 
27b80 6e 6f 74 20 74 6f 20 6f 75 74 70 75 74 20 74 77  not to output tw
27b90 6f 20 72 6f 77 73 20 74 68 61 74 20 64 75 70 6c  o rows that dupl
27ba0 69 63 61 74 65 20 74 68 65 73 65 20 2a 2f 0a 20  icate these */. 
27bb0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
27bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27bd0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
27be0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
27bf0 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41  nt.h */.  int iA
27c00 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20  uxArg           
27c10 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52    /* If WHERE_OR
27c20 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
27c30 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
27c40 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45   ** If WHERE_USE
27c70 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65  _LIMIT, then the
27c80 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f   limit amount */
27c90 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
27ca0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
27cb0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
27cc0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
27cd0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
27ce0 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27d00 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
27d10 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
27d20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
27d30 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
27d40 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
27d50 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
27d60 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
27d70 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
27d80 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
27d90 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
27da0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
27db0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
27dc0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
27dd0 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
27de0 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
27df0 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
27e00 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
27e10 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
27e20 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
27e30 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
27e40 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
27e50 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
27e60 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
27e70 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
27e80 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
27e90 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
27ea0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
27eb0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
27ec0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
27ed0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
27ee0 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
27ef0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f10 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
27f20 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
27f30 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
27f40 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
27f50 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
27f60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
27f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27f80 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
27f90 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
27fa0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46  ;         /* OPF
27fb0 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72  LAG_FORDELETE or
27fc0 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70   zero, as approp
27fd0 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65  riate */..  asse
27fe0 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
27ff0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
28000 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20  MULTIROW)==0 || 
28010 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c  (.        (wctrl
28020 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
28030 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
28040 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72  0 .     && (wctr
28050 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
28060 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
28070 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c  .  ));..  /* Onl
28080 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f  y one of WHERE_O
28090 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57  R_SUBCLAUSE or W
280a0 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a  HERE_USE_LIMIT *
280b0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
280c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
280d0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
280e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
280f0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28100 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d  ERE_USE_LIMIT)==
28110 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  0 );..  /* Varia
28120 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
28130 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
28140 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
28150 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
28160 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
28170 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
28180 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
28190 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
281a0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
281b0 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
281c0 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
281d0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
281e0 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
281f0 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
28200 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
28210 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
28220 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
28230 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
28240 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
28250 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
28260 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
28270 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
28280 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
28290 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
282a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
282b0 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
282c0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
282d0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
282e0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
282f0 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
28300 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
28310 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
28320 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
28330 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
28340 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28350 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
28360 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
28370 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
28380 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
28390 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
283a0 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
283b0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
283c0 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
283d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
283e0 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
283f0 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
28400 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
28410 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
28420 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
28430 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
28440 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
28450 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
28460 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
28470 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
28480 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
28490 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  SE flag is set, 
284a0 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
284b0 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
284c0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
284d0 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
284e0 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
284f0 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
28500 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
28510 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
28520 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
28530 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
28540 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
28550 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28560 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
28570 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
28580 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
28590 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
285a0 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
285b0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
285c0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
285d0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
285e0 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
285f0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
28600 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
28610 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
28620 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
28630 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
28640 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
28650 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
28660 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
28670 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
28680 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
28690 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
286a0 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
286b0 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
286c0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
286d0 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
286e0 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
286f0 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
28700 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
28710 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
28720 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
28730 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
28740 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
28750 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
28760 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
28770 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
28780 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
28790 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b  db, nByteWInfo +
287a0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
287b0 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  p));.  if( db->m
287c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
287d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
287e0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
287f0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
28800 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
28810 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
28820 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
28830 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
28840 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
28850 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
28860 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
28870 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rBy;.  pWInfo->p
28880 44 69 73 74 69 6e 63 74 53 65 74 20 3d 20 70 44  DistinctSet = pD
28890 69 73 74 69 6e 63 74 53 65 74 3b 0a 20 20 70 57  istinctSet;.  pW
288a0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
288b0 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e  ss[0] = pWInfo->
288c0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
288d0 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  = -1;.  pWInfo->
288e0 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
288f0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
28900 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43  eak = pWInfo->iC
28910 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
28920 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
28930 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74  );.  pWInfo->wct
28940 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46  rlFlags = wctrlF
28950 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  lags;.  pWInfo->
28960 69 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67  iLimit = iAuxArg
28970 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
28980 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
28990 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
289a0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e  ;.  memset(&pWIn
289b0 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30 2c 20 0a  fo->nOBSat, 0, .
289c0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 6f           offseto
289d0 66 28 57 68 65 72 65 49 6e 66 6f 2c 73 57 43 29  f(WhereInfo,sWC)
289e0 20 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72   - offsetof(Wher
289f0 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a  eInfo,nOBSat));.
28a00 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f    memset(&pWInfo
28a10 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[0], 0, sizeo
28a20 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b 6e 54 61  f(WhereLoop)+nTa
28a30 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28 57 68 65  bList*sizeof(Whe
28a40 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 61 73 73  reLevel));.  ass
28a50 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ert( pWInfo->eOn
28a60 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
28a70 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53  FF );  /* ONEPAS
28a80 53 20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f 46  S defaults to OF
28a90 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20  F */.  pMaskSet 
28aa0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
28ab0 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e  Set;.  sWLB.pWIn
28ac0 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73  fo = pWInfo;.  s
28ad0 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66  WLB.pWC = &pWInf
28ae0 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70  o->sWC;.  sWLB.p
28af0 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70  New = (WhereLoop
28b00 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66  *)(((char*)pWInf
28b10 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a  o)+nByteWInfo);.
28b20 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
28b30 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73  BYTE_ALIGNMENT(s
28b40 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77  WLB.pNew) );.  w
28b50 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c  hereLoopInit(sWL
28b60 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20  B.pNew);.#ifdef 
28b70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
28b80 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20  WLB.pNew->cId = 
28b90 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  '*';.#endif..  /
28ba0 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
28bb0 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
28bc0 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
28bd0 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
28be0 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
28bf0 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
28c00 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
28c10 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
28c20 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
28c30 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  );.  sqlite3Wher
28c40 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49  eClauseInit(&pWI
28c50 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f  nfo->sWC, pWInfo
28c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  );.  sqlite3Wher
28c70 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e  eSplit(&pWInfo->
28c80 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  sWC, pWhere, TK_
28c90 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  AND);.    .  /* 
28ca0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
28cb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
28cc0 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
28cd0 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
28ce0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
28cf0 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
28d00 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
28d10 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
28d20 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
28d30 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54   ii<sWLB.pWC->nT
28d40 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  erm; ii++){.    
28d50 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20  if( nTabList==0 
28d60 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
28d70 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
28d80 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e  sWLB.pWC->a[ii].
28d90 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28da0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28db0 73 65 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e  se(pParse, sWLB.
28dc0 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pWC->a[ii].pExpr
28dd0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
28de0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28df0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
28e00 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
28e10 20 20 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61       sWLB.pWC->a
28e20 5b 69 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20  [ii].wtFlags |= 
28e30 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
28e40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  }.  }..  /* Spec
28e50 69 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f  ial case: No FRO
28e60 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
28e70 69 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20  if( nTabList==0 
28e80 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
28e90 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
28ea0 42 53 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d  BSat = pOrderBy-
28eb0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
28ec0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28ed0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
28ee0 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
28ef0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
28f00 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
28f10 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  QUE;.    }.  }..
28f20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69    /* Assign a bi
28f30 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61  t from the bitma
28f40 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  sk to every term
28f50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
28f60 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  use..  **.  ** T
28f70 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20  he N-th term of 
28f80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
28f90 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62 69  is assigned a bi
28fa0 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20  tmask of 1<<N.. 
28fb0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c   **.  ** The rul
28fc0 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
28fd0 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73 75 72  s sentence ensur
28fe0 65 73 20 74 68 74 61 20 69 66 20 58 20 69 73 20  es thta if X is 
28ff0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a  the bitmask for.
29000 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20    ** a table T, 
29010 74 68 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20  then X-1 is the 
29020 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
29030 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20  other tables to 
29040 74 68 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20  the left of T.. 
29050 20 2a 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20   ** Knowing the 
29060 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
29070 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
29080 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
29090 6e 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6f 72 74  n is.  ** import
290a0 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ant.  Ticket #30
290b0 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  15..  **.  ** No
290c0 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
290d0 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
290e0 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
290f0 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
29100 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
29110 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
29120 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
29130 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
29140 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61  rmally.  ** equa
29150 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
29160 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
29170 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
29180 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
29190 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66  E_OR_SUBCLAUSE f
291a0 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
291b0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
291c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
291d0 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74  ii++){.    creat
291e0 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
291f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  pTabList->a[ii].
29200 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  iCursor);.    sq
29210 6c 69 74 65 33 57 68 65 72 65 54 61 62 46 75 6e  lite3WhereTabFun
29220 63 41 72 67 73 28 70 50 61 72 73 65 2c 20 26 70  cArgs(pParse, &p
29230 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20  TabList->a[ii], 
29240 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
29250 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
29260 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 69 3d  _DEBUG.  for(ii=
29270 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
29280 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
29290 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c   Bitmask m = sql
292a0 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
292b0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
292c0 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73  ist->a[ii].iCurs
292d0 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  or);.    assert(
292e0 20 6d 3d 3d 4d 41 53 4b 42 49 54 28 69 69 29 20   m==MASKBIT(ii) 
292f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
29300 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
29310 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
29320 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  sions. */.  sqli
29330 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c  te3WhereExprAnal
29340 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70  yze(pTabList, &p
29350 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69  WInfo->sWC);.  i
29360 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
29370 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
29380 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 69  BeginError;..  i
29390 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
293a0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
293b0 4e 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69  NCT ){.    if( i
293c0 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
293d0 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  nt(pParse, pTabL
293e0 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57  ist, &pWInfo->sW
293f0 43 2c 20 70 44 69 73 74 69 6e 63 74 53 65 74 29  C, pDistinctSet)
29400 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
29410 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e   DISTINCT markin
29420 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20  g is pointless. 
29430 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20   Ignore it. */. 
29440 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
29450 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
29460 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
29470 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
29480 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
29490 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44     /* Try to ORD
294a0 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c 74  ER BY the result
294b0 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73   set to make dis
294c0 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67  tinct processing
294d0 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20   easier */.     
294e0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
294f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53  ags |= WHERE_DIS
29500 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70  TINCTBY;.      p
29510 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
29520 3d 20 70 44 69 73 74 69 6e 63 74 53 65 74 3b 0a  = pDistinctSet;.
29530 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
29540 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68  Construct the Wh
29550 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
29560 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  */.#if defined(W
29570 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
29580 44 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  D).  if( sqlite3
29590 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 66  WhereTrace & 0xf
295a0 66 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fff ){.    sqlit
295b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a  e3DebugPrintf("*
295c0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
295d0 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61  rt *** (wctrlFla
295e0 67 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46  gs: 0x%x",wctrlF
295f0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77  lags);.    if( w
29600 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
29610 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_USE_LIMIT ){. 
29620 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
29630 67 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74  gPrintf(", limit
29640 3a 20 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b  : %d", iAuxArg);
29650 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29660 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29  e3DebugPrintf(")
29670 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
29680 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
29690 65 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20  e & 0x100 ){ /* 
296a0 44 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d  Display all term
296b0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
296c0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c  lause */.    sql
296d0 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50  ite3WhereClauseP
296e0 72 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a  rint(sWLB.pWC);.
296f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
29700 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c  ( nTabList!=1 ||
29710 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26   whereShortCut(&
29720 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sWLB)==0 ){.    
29730 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
29740 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20  dAll(&sWLB);.   
29750 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
29760 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
29770 20 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54    .#ifdef WHERET
29780 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
29790 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
297a0 65 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20  eTrace ){    /* 
297b0 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74  Display all of t
297c0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
297d0 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68  ects */.      Wh
297e0 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20  ereLoop *p;.    
297f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
29800 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
29810 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32   zLabel[] = "012
29820 33 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69  3456789abcdefghi
29830 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78  jklmnopqrstuvwyx
29840 7a 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z".             
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
29880 50 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20  PQRSTUVWYXZ";.  
29890 20 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f      for(p=pWInfo
298a0 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70  ->pLoops, i=0; p
298b0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ; p=p->pNextLoop
298c0 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  , i++){.        
298d0 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b  p->cId = zLabel[
298e0 69 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  i%sizeof(zLabel)
298f0 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ];.        where
29900 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c  LoopPrint(p, sWL
29910 42 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a  B.pWC);.      }.
29920 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a      }.#endif.  .
29930 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
29940 76 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a  ver(pWInfo, 0);.
29950 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
29960 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
29970 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
29980 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
29990 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
299a0 20 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c      wherePathSol
299b0 76 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  ver(pWInfo, pWIn
299c0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a  fo->nRowOut+1);.
299d0 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
299e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
299f0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
29a00 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
29a10 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  if( pWInfo->pOrd
29a20 65 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e  erBy==0 && (db->
29a30 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
29a40 65 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20  everseOrder)!=0 
29a50 29 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ){.     pWInfo->
29a60 72 65 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49 54  revMask = ALLBIT
29a70 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  S;.  }.  if( pPa
29a80 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56  rse->nErr || NEV
29a90 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ER(db->mallocFai
29aa0 6c 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  led) ){.    goto
29ab0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
29ac0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45  ;.  }.#ifdef WHE
29ad0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
29ae0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
29af0 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73  reTrace ){.    s
29b00 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29b10 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e  f("---- Solution
29b20 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66   nRow=%d", pWInf
29b30 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20  o->nRowOut);.   
29b40 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
29b50 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  Sat>0 ){.      s
29b60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29b70 66 28 22 20 4f 52 44 45 52 42 59 3d 25 64 2c 30  f(" ORDERBY=%d,0
29b80 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e  x%llx", pWInfo->
29b90 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e  nOBSat, pWInfo->
29ba0 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  revMask);.    }.
29bb0 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e      switch( pWIn
29bc0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b  fo->eDistinct ){
29bd0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
29be0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
29bf0 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
29c00 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
29c10 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71  "  DISTINCT=uniq
29c20 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ue");.        br
29c30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29c40 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
29c50 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
29c60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29c70 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
29c80 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64  DISTINCT=ordered
29c90 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
29ca0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
29cb0 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
29cc0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20  INCT_UNORDERED: 
29cd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29ce0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
29cf0 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72  DISTINCT=unorder
29d00 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
29d10 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29d20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
29d30 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
29d40 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
29d50 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
29d60 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  ; ii++){.      w
29d70 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57  hereLoopPrint(pW
29d80 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f  Info->a[ii].pWLo
29d90 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  op, sWLB.pWC);. 
29da0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
29db0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
29dc0 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d  omit tables from
29dd0 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64   the join that d
29de0 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65  o not effect the
29df0 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28   result */.  if(
29e00 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
29e10 3d 32 0a 20 20 20 26 26 20 70 44 69 73 74 69 6e  =2.   && pDistin
29e20 63 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f  ctSet!=0.   && O
29e30 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
29e40 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d  ed(db, SQLITE_Om
29e50 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b  itNoopJoin).  ){
29e60 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62  .    Bitmask tab
29e70 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68  Used = sqlite3Wh
29e80 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65  ereExprListUsage
29e90 28 70 4d 61 73 6b 53 65 74 2c 20 70 44 69 73 74  (pMaskSet, pDist
29ea0 69 6e 63 74 53 65 74 29 3b 0a 20 20 20 20 69 66  inctSet);.    if
29eb0 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20  ( sWLB.pOrderBy 
29ec0 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64  ){.      tabUsed
29ed0 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
29ee0 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d  ExprListUsage(pM
29ef0 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72  askSet, sWLB.pOr
29f00 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  derBy);.    }.  
29f10 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d    while( pWInfo-
29f20 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20  >nLevel>=2 ){.  
29f30 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
29f40 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  Term, *pEnd;.   
29f50 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66     pLoop = pWInf
29f60 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  o->a[pWInfo->nLe
29f70 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20  vel-1].pWLoop;. 
29f80 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f       if( (pWInfo
29f90 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
29fa0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f  oop->iTab].fg.jo
29fb0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
29fc0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
29fd0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
29fe0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
29ff0 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
2a000 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
2a010 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2a020 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
2a030 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
2a040 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2a050 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
2a060 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
2a070 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
2a080 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
2a090 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
2a0a0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
2a0b0 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
2a0c0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
2a0d0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2a0e0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2a0f0 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
2a100 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
2a110 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
2a120 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
2a130 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
2a140 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
2a150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
2a160 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2a170 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a180 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
2a190 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
2a1a0 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
2a1b0 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
2a1c0 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
2a1d0 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
2a1e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
2a1f0 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
2a200 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
2a210 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
2a220 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
2a230 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
2a240 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
2a250 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2a260 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
2a270 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
2a280 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
2a290 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2a2a0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2a2b0 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
2a2c0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
2a2d0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
2a2e0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
2a2f0 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
2a300 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2a310 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2a320 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2a330 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2a340 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2a350 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2a360 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2a370 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29  SS_DESIRED)!=0 )
2a380 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  {.    int wsFlag
2a390 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d  s = pWInfo->a[0]
2a3a0 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
2a3b0 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f  ;.    int bOnero
2a3c0 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57  w = (wsFlags & W
2a3d0 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b  HERE_ONEROW)!=0;
2a3e0 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77  .    if( bOnerow
2a3f0 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c  .     || ((wctrl
2a400 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2a410 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21  EPASS_MULTIROW)!
2a420 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2a430 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57   0==(wsFlags & W
2a440 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2a450 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  E)).    ){.     
2a460 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2a470 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e  s = bOnerow ? ON
2a480 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f  EPASS_SINGLE : O
2a490 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20  NEPASS_MULTI;.  
2a4a0 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
2a4b0 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e  (pTabList->a[0].
2a4c0 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67  pTab) && (wsFlag
2a4d0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2a4e0 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LY) ){.        i
2a4f0 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  f( wctrlFlags & 
2a500 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2a510 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  LTIROW ){.      
2a520 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d      bFordelete =
2a530 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
2a540 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
2a550 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30       pWInfo->a[0
2a560 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2a570 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e  s = (wsFlags & ~
2a580 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b  WHERE_IDX_ONLY);
2a590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a5a0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
2a5b0 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
2a5c0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
2a5d0 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
2a5e0 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
2a5f0 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
2a600 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  s..  */.  for(ii
2a610 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
2a620 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73  o->a; ii<nTabLis
2a630 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  t; ii++, pLevel+
2a640 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2a650 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
2a660 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
2a670 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
2a680 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61    /* Index of da
2a690 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2a6a0 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f  g table/index */
2a6b0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2a6c0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2a6d0 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65  em;..    pTabIte
2a6e0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2a6f0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2a700 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
2a710 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2a720 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2a730 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2a740 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2a750 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65     pLoop = pLeve
2a760 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69  l->pWLoop;.    i
2a770 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2a780 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2a790 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
2a7a0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2a7b0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2a7c0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
2a7d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2a7e0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2a7f0 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2a800 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2a810 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
2a820 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2a830 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
2a840 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
2a850 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
2a860 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
2a870 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
2a880 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
2a890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2a8a0 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
2a8b0 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
2a8c0 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
2a8d0 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
2a8e0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
2a8f0 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* noop */.    
2a900 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2a910 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2a920 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2a930 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
2a940 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
2a950 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2a960 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20  CLAUSE)==0 ){.  
2a970 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f      int op = OP_
2a980 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20  OpenRead;.      
2a990 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2a9a0 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
2a9b0 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  F ){.        op 
2a9c0 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  = OP_OpenWrite;.
2a9d0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2a9e0 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20  aiCurOnePass[0] 
2a9f0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
2aa00 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  sor;.      };.  
2aa10 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
2aa20 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
2aa30 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  bItem->iCursor, 
2aa40 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a  iDb, pTab, op);.
2aa50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2aa60 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d  abItem->iCursor=
2aa70 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
2aa80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2aa90 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  se( pWInfo->eOne
2aaa0 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2aab0 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  F && pTab->nCol=
2aac0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
2aad0 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
2aae0 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2aaf0 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2ab00 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
2ab10 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2ab20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
2ab30 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
2ab40 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f  Col<BMS && HasRo
2ab50 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
2ab60 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
2ab70 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
2ab80 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
2ab90 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
2aba0 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
2abb0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
2abc0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2abd0 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45  P4(v, -1, SQLITE
2abe0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
2abf0 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
2ac00 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
2ac10 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
2ac20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2ac30 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
2ac40 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  HINTS.      if( 
2ac50 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2ac60 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
2ac70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ac80 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
2ac90 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c  G_SEEKEQ|bFordel
2aca0 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ete);.      }els
2acb0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
2acc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2acd0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2ace0 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20  bFordelete);.   
2acf0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2ad00 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
2ad10 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
2ad20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ad30 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
2ad40 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74  umnsUsed, pTabIt
2ad50 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20  em->iCursor, 0, 
2ad60 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2ad80 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49  const u8*)&pTabI
2ad90 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34  tem->colUsed, P4
2ada0 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
2adb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2adc0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
2add0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
2ade0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
2adf0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2ae00 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
2ae10 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2ae20 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
2ae30 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
2ae40 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2ae50 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  ndex;.      int 
2ae60 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20  iIndexCur;.     
2ae70 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65   int op = OP_Ope
2ae80 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20  nRead;.      /* 
2ae90 69 41 75 78 41 72 67 20 69 73 20 61 6c 77 61 79  iAuxArg is alway
2aea0 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f  s set if to a po
2aeb0 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
2aec0 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69  ONEPASS is possi
2aed0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2aee0 65 72 74 28 20 69 41 75 78 41 72 67 21 3d 30 20  ert( iAuxArg!=0 
2aef0 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  || (pWInfo->wctr
2af00 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2af10 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2af20 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2af30 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2af40 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
2af50 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20  ndex(pIx).      
2af60 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
2af70 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2af80 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29  AUSE)!=0.      )
2af90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2afa0 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66  s is one term of
2afb0 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74   an OR-optimizat
2afc0 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52  ion using the PR
2afd0 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20  IMARY KEY of a. 
2afe0 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55         ** WITHOU
2aff0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T ROWID table.  
2b000 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65  No need for a se
2b010 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a  parate index */.
2b020 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2b030 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
2b040 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  Cur;.        op 
2b050 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2b060 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2b070 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
2b080 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e  FF ){.        In
2b090 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74  dex *pJ = pTabIt
2b0a0 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78  em->pTab->pIndex
2b0b0 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  ;.        iIndex
2b0c0 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  Cur = iAuxArg;. 
2b0d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77         assert( w
2b0e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2b0f0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2b100 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  D );.        whi
2b110 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26  le( ALWAYS(pJ) &
2b120 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20  & pJ!=pIx ){.   
2b130 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2b140 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a  ++;.          pJ
2b150 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pJ->pNext;.  
2b160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b170 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74  op = OP_OpenWrit
2b180 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  e;.        pWInf
2b190 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  o->aiCurOnePass[
2b1a0 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a  1] = iIndexCur;.
2b1b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b1c0 69 41 75 78 41 72 67 20 26 26 20 28 77 63 74 72  iAuxArg && (wctr
2b1d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2b1e0 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20  R_SUBCLAUSE)!=0 
2b1f0 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  ){.        iInde
2b200 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a  xCur = iAuxArg;.
2b210 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
2b220 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20  ReopenIdx;.     
2b230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b240 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72  iIndexCur = pPar
2b250 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2b260 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
2b270 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64  ->iIdxCur = iInd
2b280 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  exCur;.      ass
2b290 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
2b2a0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
2b2b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2b2c0 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29  ( iIndexCur>=0 )
2b2d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29  ;.      if( op )
2b2e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b2f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
2b300 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49  p, iIndexCur, pI
2b310 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
2b320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2b330 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
2b340 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
2b350 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
2b360 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2b370 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a  _CONSTRAINT)!=0.
2b380 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f           && (pLo
2b390 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  op->wsFlags & (W
2b3a0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2b3b0 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  E|WHERE_SKIPSCAN
2b3c0 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ))==0.         &
2b3d0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
2b3e0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
2b3f0 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20  RBY_MIN)==0.    
2b400 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2b410 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2b420 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53  geP5(v, OPFLAG_S
2b430 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20  EEKEQ); /* Hint 
2b440 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20  to COMDB2 */.   
2b450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56       }.        V
2b460 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2b470 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
2b480 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2b490 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
2b4a0 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
2b4b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36 34   {.          u64
2b4c0 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20   colUsed = 0;.  
2b4d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20          int ii, 
2b4e0 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  jj;.          fo
2b4f0 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e  r(ii=0; ii<pIx->
2b500 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a  nColumn; ii++){.
2b510 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
2b520 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pIx->aiColumn[i
2b530 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
2b540 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69  if( jj<0 ) conti
2b550 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2b560 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20   if( jj>63 ) jj 
2b570 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20  = 63;.          
2b580 20 20 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d    if( (pTabItem-
2b590 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42  >colUsed & MASKB
2b5a0 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e  IT(jj))==0 ) con
2b5b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2b5c0 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28     colUsed |= ((
2b5d0 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f  u64)1)<<(ii<63 ?
2b5e0 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20   ii : 63);.     
2b5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b610 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
2b620 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78  umnsUsed, iIndex
2b630 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  Cur, 0, 0,.     
2b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b650 20 20 20 20 20 20 20 20 20 20 20 28 75 38 2a 29             (u8*)
2b660 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54  &colUsed, P4_INT
2b670 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  64);.        }.#
2b680 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2b690 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53  ENABLE_COLUMN_US
2b6a0 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20  ED_MASK */.     
2b6b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2b6c0 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65   iDb>=0 ) sqlite
2b6d0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
2b6e0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
2b6f0 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
2b700 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2b710 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2b720 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b730 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2b740 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
2b750 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
2b760 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
2b770 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
2b780 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
2b790 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
2b7a0 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
2b7b0 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
2b7c0 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
2b7d0 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
2b7e0 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
2b7f0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
2b800 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  0;.  for(ii=0; i
2b810 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b  i<nTabList; ii++
2b820 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  ){.    int addrE
2b830 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20  xplain;.    int 
2b840 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65  wsFlags;.    pLe
2b850 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
2b860 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67  [ii];.    wsFlag
2b870 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  s = pLevel->pWLo
2b880 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66  op->wsFlags;.#if
2b890 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b8a0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2b8b0 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
2b8c0 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
2b8d0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
2b8e0 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
2b8f0 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d    constructAutom
2b900 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65  aticIndex(pParse
2b910 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a  , &pWInfo->sWC,.
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b930 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2b940 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74  vel->iFrom], not
2b950 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a  Ready, pLevel);.
2b960 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
2b970 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2b980 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2b990 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  r;.    }.#endif.
2b9a0 20 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20      addrExplain 
2b9b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
2b9c0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
2b9d0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54        pParse, pT
2b9e0 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
2b9f0 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ii, pLevel->iFro
2ba00 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20  m, wctrlFlags.  
2ba10 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d    );.    pLevel-
2ba20 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69  >addrBody = sqli
2ba30 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2ba40 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65  dr(v);.    notRe
2ba50 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ady = sqlite3Whe
2ba60 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  reCodeOneLoopSta
2ba70 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e  rt(pWInfo, ii, n
2ba80 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
2ba90 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
2baa0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
2bab0 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46  nt;.    if( (wsF
2bac0 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
2bad0 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72  _OR)==0 && (wctr
2bae0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f  lFlags&WHERE_OR_
2baf0 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b  SUBCLAUSE)==0 ){
2bb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
2bb10 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75 73  ereAddScanStatus
2bb20 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  (v, pTabList, pL
2bb30 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69  evel, addrExplai
2bb40 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
2bb50 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56   /* Done. */.  V
2bb60 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
2bb70 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52  ((v, "Begin WHER
2bb80 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74  E-core"));.  ret
2bb90 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
2bba0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
2bbb0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
2bbc0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
2bbd0 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
2bbe0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
2bbf0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2bc00 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2bc10 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
2bc20 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2bc30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2bc40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
2bc50 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
2bc60 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53  e WHERE loop.  S
2bc70 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a  ee comments on .
2bc80 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
2bc90 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74  egin() for addit
2bca0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2bcb0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2bcc0 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65  e3WhereEnd(Where
2bcd0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
2bce0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2bcf0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
2bd00 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2bd10 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2bd20 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  t i;.  WhereLeve
2bd30 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65  l *pLevel;.  Whe
2bd40 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
2bd50 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2bd60 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
2bd70 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
2bd80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2bd90 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
2bda0 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
2bdb0 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
2bdc0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
2bdd0 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45  t((v, "End WHERE
2bde0 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69  -core"));.  sqli
2bdf0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2be00 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
2be10 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
2be20 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
2be30 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
2be40 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2be50 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
2be60 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
2be70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74  WLoop;.    sqlit
2be80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2be90 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2bea0 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28  drCont);.    if(
2beb0 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f   pLevel->op!=OP_
2bec0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
2bed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2bee0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
2bef0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
2bf00 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p2, pLevel->p
2bf10 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
2bf20 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2bf30 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20   pLevel->p5);.  
2bf40 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2bf50 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
2bf60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65  overageIf(v, pLe
2bf70 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74  vel->op==OP_Next
2bf80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
2bf90 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
2bfa0 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b  l->op==OP_Prev);
2bfb0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2bfc0 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
2bfd0 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a  >op==OP_VNext);.
2bfe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
2bff0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2c000 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
2c010 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
2c020 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
2c030 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
2c040 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2c050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2c060 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2c070 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
2c080 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
2c090 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
2c0a0 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
2c0b0 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
2c0c0 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
2c0d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c0e0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
2c0f0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
2c100 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
2c110 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d 4f  n->eEndLoopOp!=O
2c120 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
2c130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c140 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45  ddOp2(v, pIn->eE
2c150 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69  ndLoopOp, pIn->i
2c160 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  Cur, pIn->addrIn
2c170 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Top);.          
2c180 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2c190 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
2c1a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e  overageIf(v, pIn
2c1b0 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50  ->eEndLoopOp==OP
2c1c0 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20  _PrevIfOpen);.  
2c1d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2c1e0 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65  rageIf(v, pIn->e
2c1f0 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65  EndLoopOp==OP_Ne
2c200 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20  xtIfOpen);.     
2c210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2c220 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2c230 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
2c240 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
2c250 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2c260 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2c270 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2c280 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
2c290 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29  evel->addrSkip )
2c2a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2c2b0 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65  dbeGoto(v, pLeve
2c2c0 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20  l->addrSkip);.  
2c2d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c2e0 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73  (v, "next skip-s
2c2f0 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f  can on %s", pLoo
2c300 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2c310 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
2c320 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2c330 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d  pHere(v, pLevel-
2c340 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
2c350 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2c360 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d  pHere(v, pLevel-
2c370 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20  >addrSkip-2);.  
2c380 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2c390 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d  TE_LIKE_DOESNT_M
2c3a0 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69  ATCH_BLOBS.    i
2c3b0 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c  f( pLevel->addrL
2c3c0 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20  ikeRep ){.      
2c3d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c3e0 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
2c3f0 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65 76  Zero, (int)(pLev
2c400 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  el->iLikeRepCntr
2c410 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >>1),.          
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
2c430 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65  evel->addrLikeRe
2c440 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
2c450 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
2c460 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2c470 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
2c480 6e 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20  n ){.      addr 
2c490 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2c4a0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
2c4b0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2c4c0 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
2c4d0 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
2c4e0 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2c4f0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2c500 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
2c510 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77      || (pLoop->w
2c520 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2c530 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
2c540 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2c550 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c560 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
2c570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c580 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2c590 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
2c5a0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
2c5b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c5c0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2c5d0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2c5e0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ED ){.        sq
2c5f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2c600 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
2c610 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
2c620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c630 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
2c640 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
2c650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c660 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2c670 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
2c680 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
2c690 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2c6a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c6b0 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65  dbeGoto(v, pLeve
2c6c0 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
2c6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2c6e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2c6f0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
2c700 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
2c710 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
2c720 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73  WHERE-loop%d: %s
2c730 22 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20  ", i,.          
2c740 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
2c750 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2c760 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54  Level->iFrom].pT
2c770 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
2c780 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
2c790 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
2c7a0 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
2c7b0 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
2c7c0 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
2c7d0 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
2c7e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2c7f0 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
2c800 72 65 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74  reak);..  assert
2c810 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
2c820 3c 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  <=pTabList->nSrc
2c830 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
2c840 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2c850 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
2c860 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
2c870 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61  ){.    int k, la
2c880 73 74 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a  st;.    VdbeOp *
2c890 70 4f 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  pOp;.    Index *
2c8a0 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74  pIdx = 0;.    st
2c8b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2c8c0 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
2c8d0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2c8e0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
2c8f0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
2c900 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2c910 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
2c920 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20   );.    pLoop = 
2c930 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
2c940 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f  .    /* For a co
2c950 2d 72 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65  -routine, change
2c960 20 61 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72   all OP_Column r
2c970 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2c980 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
2c990 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
2c9a0 69 6e 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20  into OP_Copy of 
2c9b0 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64  result contained
2c9c0 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a   in a register..
2c9d0 20 20 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20      ** OP_Rowid 
2c9e0 62 65 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e  becomes OP_Null.
2c9f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ca00 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
2ca10 43 6f 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62  Coroutine && !db
2ca20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2ca30 7b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74  {.      translat
2ca40 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c  eColumnToCopy(v,
2ca50 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
2ca60 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  y, pLevel->iTabC
2ca70 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca90 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73  pTabItem->regRes
2caa0 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  ult, 0);.      c
2cab0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
2cac0 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c      /* Close all
2cad0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
2cae0 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
2caf0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
2cb00 42 65 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78  Begin..    ** Ex
2cb10 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f  cept, do not clo
2cb20 73 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  se cursors that 
2cb30 77 69 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62  will be reused b
2cb40 79 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a  y the OR optimiz
2cb50 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48  ation.    ** (WH
2cb60 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2cb70 29 2e 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63  ).  And do not c
2cb80 6c 6f 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  lose the OP_Open
2cb90 57 72 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20  Write cursors.  
2cba0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
2cbb0 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
2cbc0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  imization..    *
2cbd0 2f 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  /.    if( (pTab-
2cbe0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
2cbf0 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
2cc00 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
2cc10 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
2cc20 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2cc30 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2cc40 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 29  CLAUSE)==0.    )
2cc50 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d  {.      int ws =
2cc60 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
2cc70 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
2cc80 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2cc90 50 41 53 53 5f 4f 46 46 20 26 26 20 28 77 73 20  PASS_OFF && (ws 
2cca0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2ccb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2ccc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ccd0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
2cce0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2ccf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2cd00 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2cd10 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
2cd20 20 20 20 20 26 26 20 28 77 73 20 26 20 28 57 48      && (ws & (WH
2cd30 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55  ERE_IPK|WHERE_AU
2cd40 54 4f 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20  TO_INDEX))==0 . 
2cd50 20 20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d        && pLevel-
2cd60 3e 69 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f  >iIdxCur!=pWInfo
2cd70 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
2cd80 5d 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ].      ){.     
2cd90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2cda0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
2cdb0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
2cdc0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2cdd0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
2cde0 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
2cdf0 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20  ndex, make VDBE 
2ce00 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
2ce10 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
2ce20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
2ce30 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
2ce40 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2ce50 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20  where possible. 
2ce60 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20   In some cases. 
2ce70 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d     ** this optim
2ce80 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73  ization prevents
2ce90 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
2cea0 65 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c  ever being read,
2ceb0 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a   which can.    *
2cec0 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66  * yield a signif
2ced0 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63  icant performanc
2cee0 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20  e boost..    ** 
2cef0 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
2cf00 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
2cf10 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
2cf20 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2cf30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
2cf40 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
2cf50 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
2cf60 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
2cf70 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
2cf80 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
2cf90 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
2cfa0 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
2cfb0 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
2cfc0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
2cfd0 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
2cfe0 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
2cff0 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
2d000 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
2d010 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
2d020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2d030 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2d040 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
2d050 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20  WHERE_IDX_ONLY) 
2d060 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  ){.      pIdx = 
2d070 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2d080 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
2d090 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2d0a0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
2d0b0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49  I_OR ){.      pI
2d0c0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  dx = pLevel->u.p
2d0d0 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  Covidx;.    }.  
2d0e0 20 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20    if( pIdx.     
2d0f0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  && (pWInfo->eOne
2d100 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass==ONEPASS_OF
2d110 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  F || !HasRowid(p
2d120 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20  Idx->pTable)).  
2d130 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f     && !db->mallo
2d140 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20  cFailed.    ){. 
2d150 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
2d160 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2d170 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d  dr(v);.      k =
2d180 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
2d190 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  y;.      pOp = s
2d1a0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2d1b0 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72  v, k);.      for
2d1c0 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20  (; k<last; k++, 
2d1d0 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
2d1e0 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
2d1f0 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
2d200 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d210 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2d220 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
2d230 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d           int x =
2d240 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
2d250 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
2d260 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  ->pTable==pTab )
2d270 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d280 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2d290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  ){.            I
2d2a0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69  ndex *pPk = sqli
2d2b0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
2d2c0 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
2d2d0 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61        x = pPk->a
2d2e0 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20  iColumn[x];.    
2d2f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d300 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  x>=0 );.        
2d310 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20    }.          x 
2d320 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
2d330 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b  fIndex(pIdx, x);
2d340 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
2d350 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2d360 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a     pOp->p2 = x;.
2d370 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
2d380 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2d390 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2d3a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
2d3b0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2d3c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2d3d0 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d  _ONLY)==0 || x>=
2d3e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  0 );.        }el
2d3f0 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
2d400 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
2d410 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
2d420 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
2d430 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
2d440 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
2d450 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
2d460 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d470 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
2d480 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
2d490 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2d4a0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
2d4b0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
2d4c0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
2d4d0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  b, pWInfo);.  re
2d4e0 74 75 72 6e 3b 0a 7d 0a                          turn;.}.