/ Hex Artifact Content
Login

Artifact 48eed8ebe319c6cbc7bf7682018f32af0f5189f5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45  while( pScan->iE
1950: 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv<=pScan->nEq
1960: 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20  uiv ){.    iCur 
1970: 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70  = pScan->aiCur[p
1980: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
1990: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
19a0: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
19b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
19c0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
19d0: 3d 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63  ==XN_EXPR && pSc
19e0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20  an->pIdxExpr==0 
19f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a00: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
1a10: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
1a20: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a30: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a40: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a50: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a60: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a70: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a80: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a90: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1aa0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1ab0: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1ac0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ad0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ae0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
1af0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
1b00: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1b10: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1b20: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1b30: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1b40: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1b50: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1b60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1b70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1b80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b90: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1ba0: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
1bb0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
1bc0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
1bd0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
1be0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1bf0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
1c00: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1c10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1c20: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1c30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1c50: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1c60: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1c80: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1c90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1ca0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
1cb0: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
1cc0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1d20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1d30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1d40: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1d60: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1d70: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1d80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1d90: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1da0: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1db0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1dc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1dd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1de0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e00: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1e10: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1e20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e30: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1e40: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1e50: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1e60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e70: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1eb0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1ec0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1ed0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ee0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1ef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1f00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1f10: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1f20: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f70: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1fa0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1fb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1ff0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
2000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2010: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
2020: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2030: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2060: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
2070: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2090: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
20d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
20e0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2100: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
2110: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
2120: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
2130: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
2140: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
2150: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
2160: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
2170: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
2180: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
2190: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21c0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
21d0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
2200: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
2210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2220: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
2230: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2240: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
2250: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
2260: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
2270: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
2280: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
2290: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
22a0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
22b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
22c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
22e0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
22f0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
2300: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2310: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2320: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2330: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2340: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2360: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2370: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2380: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2390: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
23a0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
23b0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
23c0: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
23d0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
23e0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
23f0: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
2400: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
2410: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
2420: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
2430: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2440: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
2450: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2460: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2470: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2480: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2490: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
24a0: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
24b0: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
24c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24d0: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
24e0: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
24f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2500: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2510: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
2520: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
2530: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
2540: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
2550: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2560: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2570: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2580: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2590: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
25a0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
25b0: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
25c0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
25d0: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
25e0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
25f0: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2600: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2610: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
2620: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
2630: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
2640: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
2650: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2660: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2670: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2680: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
26b0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
26f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2700: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2710: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
2720: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
2730: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
2740: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
2750: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2760: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2770: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2780: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2790: 0a 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b  .){.  int j = 0;
27a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
27b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
27c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
27d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
27e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
27f0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2800: 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20  >pIdxExpr = 0;. 
2810: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2820: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
2830: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
2840: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2850: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2860: 58 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d  XN_EXPR ) pScan-
2870: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2880: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
28a0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
28b0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
28c0: 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
28d0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  D;.  }.  if( pId
28e0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
28f0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
2900: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
2910: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
2930: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2940: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2950: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
2960: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
2970: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
2980: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2990: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
29a0: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
29b0: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
29c0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
29d0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
29e0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
29f0: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
2a00: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
2a10: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
2a20: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
2a30: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2a50: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
2a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2a70: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
2a80: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2a90: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2aa0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ab0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2ac0: 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66 20  able iCur or of 
2ad0: 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69 66  index pIdx.** if
2ae0: 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70   pIdx!=0 and <op
2af0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  > is one of the 
2b00: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
2b10: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
2b20: 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72 61  y.** the op para
2b30: 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61  meter.  Return a
2b40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b50: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
2b60: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2b70: 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20 74  .** If pIdx!=0 t
2b80: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 6f  hen it must be o
2b90: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65  ne of the indexe
2ba0: 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  s of table iCur.
2bb0: 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72    .** Search for
2bc0: 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20   terms matching 
2bd0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
2be0: 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a  olumn of pIdx.**
2bf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
2c00: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
2c10: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2c30: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
2c40: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
2c50: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
2c60: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
2c70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c80: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
2c90: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
2ca0: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
2cb0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
2cc0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
2cd0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
2ce0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
2cf0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
2d00: 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75  * aiCur[]/iaColu
2d10: 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64  mn[] arrays hold
2d20: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
2d30: 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72  quivalents. Ther
2d40: 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74  e are 11.** slot
2d50: 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43  s in aiCur[]/aiC
2d60: 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20  olumn[] so that 
2d70: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f  means we can loo
2d80: 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20  k for X plus up 
2d90: 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65  to 10.** other e
2da0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
2db0: 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  .  Hence a searc
2dc0: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
2dd0: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
2de0: 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20  A1.** and A1=A2 
2df0: 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e  and A2=A3 and ..
2e00: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
2e10: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
2e20: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
2e30: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
2e40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2e50: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
2e60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
2e70: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
2e80: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
2e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
2ea0: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
2eb0: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
2ec0: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
2ed0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
2ee0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
2ef0: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
2f00: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
2f10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
2f20: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
2f30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
2f40: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
2f50: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
2f60: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
2f70: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
2f80: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
2f90: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
2fa0: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
2fb0: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
2fc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
2fd0: 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54  EQUIV..*/.WhereT
2fe0: 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72  erm *sqlite3Wher
2ff0: 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  eFindTerm(.  Whe
3000: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3010: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3020: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
3030: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3040: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3050: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3060: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3070: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3080: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3090: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
30a0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
30b0: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
30c0: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
30d0: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
30e0: 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20  .  u32 op,      
30f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
3100: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
3110: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
3120: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
3130: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3140: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3150: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3160: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3170: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3180: 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20  Term *pResult = 
3190: 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  0;.  WhereTerm *
31a0: 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  p;.  WhereScan s
31b0: 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72  can;..  p = wher
31c0: 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
31d0: 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c   pWC, iCur, iCol
31e0: 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a  umn, op, pIdx);.
31f0: 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f    op &= WO_EQ|WO
3200: 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  _IS;.  while( p 
3210: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  ){.    if( (p->p
3220: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3230: 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
3240: 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71     if( p->prereq
3250: 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e  Right==0 && (p->
3260: 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30  eOperator&op)!=0
3270: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
3280: 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74  case( p->eOperat
3290: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
32a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
32b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32c0: 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70  ( pResult==0 ) p
32d0: 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20  Result = p;.    
32e0: 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53  }.    p = whereS
32f0: 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a  canNext(&scan);.
3300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3310: 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  sult;.}../*.** T
3320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
3330: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
3340: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  an entry that ma
3350: 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
3360: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
3370: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
3380: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
3390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
33a0: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
33b0: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
33c0: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
33d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
33e0: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
33f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3400: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
3410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3440: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3450: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
3460: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3470: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
3480: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
3490: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
34a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34b0: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
34c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
34d0: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
34e0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3500: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
3510: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
3520: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3540: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
3550: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
3560: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
3570: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
3580: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
3590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
35a0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
35b0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
35c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
35d0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
35e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
35f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3600: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
3610: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
3620: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
3630: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
3640: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
3650: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
3660: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3670: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
3680: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
3690: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
36a0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
36b0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
36c0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
36d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
36e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3710: 54 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c  TRUE if the iCol
3720: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
3730: 64 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20  dex pIdx is NOT 
3740: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
3750: 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  nt indexColumnNo
3760: 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64  tNull(Index *pId
3770: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
3780: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
3790: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73   pIdx!=0 );.  as
37a0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
37b0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
37c0: 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64  umn );.  j = pId
37d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
37e0: 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b  ];.  if( j>=0 ){
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78  .    return pIdx
3800: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
3810: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c  ].notNull;.  }el
3820: 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29  se if( j==(-1) )
3830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3850: 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a  ert( j==(-2) );.
3860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
3870: 2a 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65  * Assume an inde
3880: 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63  xed expression c
3890: 61 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20  an always yield 
38a0: 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d  a NULL */..  }.}
38b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
38c0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
38d0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
38e0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
38f0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
3900: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
3910: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
3920: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
3930: 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73  dant if any subs
3940: 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  et of the column
3950: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54  s in the.** DIST
3960: 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f  INCT list are co
3970: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
3980: 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  e and individual
3990: 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  ly non-null..*/.
39a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
39b0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
39c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
39e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
39f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
3a00: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
3a10: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
3a20: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a30: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
3a40: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3a50: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
3a60: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
3a70: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
3a80: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
3a90: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
3aa0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3ab0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
3ac0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
3af0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
3b00: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
3b10: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
3b20: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
3b30: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
3b40: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
3b50: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
3b60: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
3b70: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
3b80: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
3b90: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
3ba0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
3bb0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
3bc0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
3bd0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
3be0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
3bf0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
3c00: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
3c10: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
3c20: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
3c30: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
3c40: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
3c50: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
3c60: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
3c70: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
3c80: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
3c90: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
3ca0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
3cb0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
3cc0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
3cd0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
3ce0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
3cf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3d00: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
3d10: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
3d20: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
3d30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
3d40: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3d50: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
3d60: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
3d70: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
3d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
3d90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
3da0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
3db0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
3dc0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
3dd0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
3de0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3df0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
3e00: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
3e10: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
3e20: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
3e30: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
3e40: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
3e50: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3e60: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
3e70: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
3e80: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
3e90: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
3ea0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3eb0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
3ec0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
3ed0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
3ee0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
3ef0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
3f00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
3f10: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
3f20: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
3f30: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
3f40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
3f50: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
3f60: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
3f70: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
3f80: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
3f90: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
3fa0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3fb0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
3fc0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
3fd0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
3fe0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
3ff0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
4000: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
4010: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
4020: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
4030: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4040: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
4050: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
4060: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4070: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
4080: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4090: 30 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46  0==sqlite3WhereF
40a0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
40b0: 73 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b  se, i, ~(Bitmask
40c0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
40d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
40e0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
40f0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
4100: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c  iBase, pIdx, i)<
4110: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4120: 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75     if( indexColu
4130: 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20  mnNotNull(pIdx, 
4140: 69 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i)==0 ) break;. 
4150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4160: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
4170: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
4180: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
4190: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
41a0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
41b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
41c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
41e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
41f0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
4200: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
4210: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
4220: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
4230: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
4240: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
4250: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
4260: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
4270: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
4280: 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d  Convert OP_Colum
4290: 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f  n opcodes to OP_
42a0: 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73  Copy in previous
42b0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ly generated cod
42c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
42d0: 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20  utine runs over 
42e0: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
42f0: 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74  ode and translat
4300: 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20  es OP_Column.** 
4310: 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f  opcodes into OP_
4320: 43 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61  Copy when the ta
4330: 62 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63  ble is being acc
4340: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
4350: 74 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64  tine .** instead
4360: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
4370: 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  okup..**.** If t
4380: 68 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61  he bIncrRowid pa
4390: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
43a0: 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20  en any OP_Rowid 
43b0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a  instructions on.
43c0: 2a 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75  ** cursor iTabCu
43d0: 72 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65  r are transforme
43e0: 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20  d into OP_Null. 
43f0: 4f 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69  Or, if bIncrRowi
4400: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a  d is non-zero,.*
4410: 2a 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52  * then each OP_R
4420: 6f 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72  owid is transfor
4430: 6d 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  med into an inst
4440: 72 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65  ruction to incre
4450: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ment the.** valu
4460: 65 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20  e stored in its 
4470: 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e  output register.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
44a0: 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76  oCopy(.  Vdbe *v
44b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
44c0: 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e  The VDBE contain
44d0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e  ing code to tran
44e0: 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  slate */.  int i
44f0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4500: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4520: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4530: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4540: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4550: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4560: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4570: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4580: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4590: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
45a0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
45c0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
45d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
45e0: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
45f0: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4600: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
4610: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4620: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4630: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4640: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4650: 64 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20  ddr(v);.  for(; 
4660: 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74  iStart<iEnd; iSt
4670: 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  art++, pOp++){. 
4680: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
4690: 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
46a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ue;.    if( pOp-
46b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
46c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  mn ){.      pOp-
46d0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
46e0: 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  y;.      pOp->p1
46f0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65   = pOp->p2 + iRe
4700: 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f  gister;.      pO
4710: 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b  p->p2 = pOp->p3;
4720: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  .      pOp->p3 =
4730: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
4740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
4750: 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
4760: 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20   if( bIncrRowid 
4770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
4780: 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
4790: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
47a0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P2 operand of th
47b0: 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20  e OP_Rowid. */. 
47c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
47d0: 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a  de = OP_AddImm;.
47e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
47f0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
4800: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a     pOp->p2 = 1;.
4810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4820: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4830: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
4840: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b      pOp->p1 = 0;
4850: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
4860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4870: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4880: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
4890: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
48a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
48b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
48c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
48d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
48e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
48f0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
4900: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
4910: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
4920: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
4930: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
4940: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
4950: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
4960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4970: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
4980: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
4990: 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
49a0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
49b0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
49c0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
49d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
49e0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
49f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4a00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4a10: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4a20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4a30: 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
4a40: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
4a50: 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
4a60: 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
4a70: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
4a80: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4a90: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
4aa0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4ab0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
4ac0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4ad0: 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
4ae0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4af0: 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
4b00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4b10: 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4b30: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4b40: 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
4b50: 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
4b60: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4b70: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
4b80: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
4b90: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
4ba0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
4bb0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
4bc0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
4bd0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
4be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
4bf0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
4c00: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4c10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4c20: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4c30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c40: 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
4c50: 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
4c60: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4c70: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4c80: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
4c90: 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
4ca0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4cb0: 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
4cc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
4cd0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
4ce0: 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
4cf0: 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
4d00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d10: 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
4d20: 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
4d30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4d40: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
4d50: 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
4d60: 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
4d70: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4d80: 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
4d90: 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
4da0: 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71  matedCost);.  sq
4db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4dc0: 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77  ("  estimatedRow
4dd0: 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73  s=%lld\n", p->es
4de0: 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a  timatedRows);.}.
4df0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
4e00: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
4e10: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
4e20: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
4e30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
4e50: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
4e60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4e70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4e80: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
4e90: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
4ea0: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
4eb0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
4ec0: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
4ed0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
4ee0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
4ef0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
4f00: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
4f10: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
4f20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
4f50: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
4f60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4f70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
4f80: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
4f90: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
4fa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4fb0: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
4fc0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
4fd0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
4fe0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
4ff0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
5000: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
5010: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
5020: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
5030: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
5040: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
5050: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75  O_IS))==0 ) retu
5060: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5070: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5080: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
5090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
50a0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
50b0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
50c0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
50d0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
50e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
50f0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
5100: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
5110: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
5120: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
5130: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
5140: 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
5150: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
5160: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5170: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
5180: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5190: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
51a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
51b0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
51c0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
51d0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
51e0: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
51f0: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
5200: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
5210: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
5220: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
5230: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
5240: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
5250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5260: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
5270: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
5280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
52a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
52b0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
52c0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
52d0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
52e0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
52f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5300: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
5310: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
5320: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
5330: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
5340: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
5350: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
5360: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
5370: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
5380: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
5390: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
53a0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
53b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
53c0: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
53d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
53e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
53f0: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
5400: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
5410: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
5430: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
5440: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
5450: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
5460: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
5470: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
5480: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
5490: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
54a0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
54b0: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
54c0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
54d0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54f0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
5500: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
5510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
5520: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
5530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5540: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
5550: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
5560: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
5570: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
5580: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5590: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
55a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
55b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
55c0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
55d0: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
55e0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
55f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5600: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5610: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
5620: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
5650: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5660: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5670: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5680: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5690: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
56b0: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
56c0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
56d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56f0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5700: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
5710: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
5720: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
5730: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
5740: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
5750: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
5760: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5770: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
5780: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
5790: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
57a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
57b0: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
57c0: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
57d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
57e0: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
57f0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
5800: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5810: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
5820: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
5830: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
5840: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
5850: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
5860: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
5870: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
5880: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
5890: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
58a0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
58b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
58c0: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
58d0: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73  uded rows */.  s
58e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58f0: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
5900: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
5910: 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  rm being indexed
5920: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
5930: 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  unter = 0;      
5940: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65    /* Address whe
5950: 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74  re integer count
5960: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5970: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5980: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5990: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
59a0: 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72  egisters where r
59b0: 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c  ecord is assembl
59c0: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
59d0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
59e0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
59f0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
5a00: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
5a10: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
5a20: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
5a30: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
5a40: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
5a50: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
5a60: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
5a70: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
5a80: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
5a90: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
5aa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5ab0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
5ac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5ad0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
5ae0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
5af0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
5b00: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
5b10: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
5b20: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
5b30: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
5b40: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
5b50: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
5b60: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
5b70: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
5b80: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
5b90: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5ba0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5bb0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5bc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
5bd0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
5be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
5bf0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5c00: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
5c10: 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20  n)    /* prereq 
5c20: 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20  always non-zero 
5c30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
5c40: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
5c50: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
5c60: 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20  rsor   /*   for 
5c70: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20  the right-hand  
5c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
5c90: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30  pLoop->prereq!=0
5ca0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
5cb0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62          /*   tab
5cc0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
5cd0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  N */.    if( pLo
5ce0: 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20  op->prereq==0.  
5cf0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
5d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
5d10: 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26  TUAL)==0.     &&
5d20: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5d30: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
5d40: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71  Join).     && sq
5d50: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
5d60: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20  Constant(pExpr, 
5d70: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29  pSrc->iCursor) )
5d80: 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c  {.      pPartial
5d90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
5da0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  d(pParse->db, pP
5db0: 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20  artial,.        
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5de0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5df0: 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  b, pExpr, 0));. 
5e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
5e10: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
5e20: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
5e30: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
5e40: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
5e50: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
5e60: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
5e70: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
5e80: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
5e90: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
5ea0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5eb0: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
5ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5ed0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5ee0: 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e     if( !sentWarn
5ef0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
5f00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5f10: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
5f20: 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DEX,.           
5f30: 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65   "automatic inde
5f40: 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54  x on %s(%s)", pT
5f50: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
5f60: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
5f70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
5f80: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74  e);.        sent
5f90: 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Warning = 1;.   
5fa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
5fb0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
5fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
5fd0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
5fe0: 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
5ff0: 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  Loop, nKeyCol+1)
6000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
6010: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6020: 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20  x_create;.      
6030: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
6040: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
6050: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
6060: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
6070: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
6080: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6090: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
60a0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
60b0: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
60c0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
60d0: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
60e0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
60f0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
6100: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
6110: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
6120: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
6130: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
6140: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
6150: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
6160: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6170: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
6180: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
6190: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
61a0: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
61b0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
61c0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
61d0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
61e0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
61f0: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
6200: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
6210: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
6220: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
6230: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
6240: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
6250: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
6260: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
6270: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
6280: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
6290: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
62a0: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
62b0: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
62c0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
62d0: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
62e0: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
62f0: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
6300: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
6310: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
6320: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
6330: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
6340: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28   mxBitCol = MIN(
6350: 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43  BMS-1,pTable->nC
6360: 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ol);.  testcase(
6370: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
6380: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
6390: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
63a0: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
63b0: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
63c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
63d0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
63e0: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
63f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
6400: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
6410: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
6420: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
6430: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
6440: 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  S + 1;.  }..  /*
6450: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
6460: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
6470: 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
6480: 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  ex */.  pIdx = s
6490: 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
64a0: 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65  dexObject(pParse
64b0: 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c  ->db, nKeyCol+1,
64c0: 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a   0, &zNotUsed);.
64d0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
64e0: 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e  goto end_auto_in
64f0: 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c  dex_create;.  pL
6500: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
6510: 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
6520: 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
6530: 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
6540: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
6550: 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
6560: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
6570: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
6580: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
6590: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
65a0: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
65b0: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
65c0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
65d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
65e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
65f0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
6600: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
6610: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
6620: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
6630: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6640: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
6650: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6660: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
6670: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
6680: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
6690: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
66a0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
66b0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
66c0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
66d0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
66e0: 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
66f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
6700: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
6710: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
6720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
6730: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
6740: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
6750: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6760: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
6770: 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65  ->zName : sqlite
6780: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6790: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
67a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
67b0: 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f  ert( (u32)n==pLo
67c0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
67d0: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
67e0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
67f0: 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
6800: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6810: 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
6820: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
6830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
6840: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
6850: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
6860: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a  & MASKBIT(i) ){.
6870: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6880: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
6890: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
68a0: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
68b0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
68c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
68d0: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
68e0: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
68f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
6900: 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
6910: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6920: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6930: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6940: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6950: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6960: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6970: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
6980: 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20   n==nKeyCol );. 
6990: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
69a0: 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  n] = XN_ROWID;. 
69b0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
69d0: 41 52 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ARY;..  /* Creat
69e0: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
69f0: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
6a00: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
6a10: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
6a20: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
6a30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
6a40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6a50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
6a60: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
6a70: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
6a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6a90: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
6aa0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
6ab0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
6ac0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
6ad0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
6ae0: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
6af0: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
6b00: 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tent */.  sqlite
6b10: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
6b20: 50 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74  Parse);.  pTabIt
6b30: 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66  em = &pWC->pWInf
6b40: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
6b50: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
6b60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6b70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6b80: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
6b90: 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
6ba0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64  egReturn;.    ad
6bb0: 64 72 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  drCounter = sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6bd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6be0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6bf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c00: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
6c10: 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
6c20: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
6c30: 62 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  b);.    addrTop 
6c40: 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
6c50: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
6c60: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
6c70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6c80: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
6c90: 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
6ca0: 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
6cb0: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
6cc0: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
6cd0: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
6ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6cf0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
6d00: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64  el->iTabCur); Vd
6d10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6d20: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61   }.  if( pPartia
6d30: 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e  l ){.    iContin
6d40: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
6d50: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
6d70: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61  alse(pParse, pPa
6d80: 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65  rtial, iContinue
6d90: 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
6da0: 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  ULL);.    pLoop-
6db0: 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
6dc0: 45 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20  E_PARTIALIDX;.  
6dd0: 7d 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  }.  regRecord = 
6de0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6df0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6e00: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
6e10: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a  nerateIndexKey(.
6e20: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49        pParse, pI
6e30: 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
6e40: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
6e50: 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  0, 0, 0, 0.  );.
6e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e70: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6e80: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
6e90: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
6ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
6eb0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6ec0: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
6ed0: 3b 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  ;.  if( pPartial
6ee0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
6ef0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
6f00: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
6f10: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6f20: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6f30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6f40: 67 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e  geP2(v, addrCoun
6f50: 74 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b  ter, regBase+n);
6f60: 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f  .    translateCo
6f70: 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64  lumnToCopy(v, ad
6f80: 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  drTop, pLevel->i
6f90: 54 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d  TabCur, pTabItem
6fa0: 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  ->regResult, 1);
6fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6fc0: 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
6fd0: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
6fe0: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6ff0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7010: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
7020: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
7030: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
7040: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7050: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
7060: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
7070: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
7080: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
7090: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
70a0: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
70b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
70c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
70d0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
70e0: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
70f0: 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
7100: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
7110: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
7120: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
7130: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7140: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
7150: 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
7160: 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
7170: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7180: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
7190: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
71a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
71b0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
71c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
71d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
71e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
71f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
7200: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7210: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
7220: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
7230: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
7240: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
7250: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
7260: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
7270: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
7280: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
7290: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
72a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
72b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
72c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
72d0: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
72e0: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
72f0: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
7300: 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d  use *pWC,.  Bitm
7310: 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20  ask mUnusable,  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7330: 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68  gnore terms with
7340: 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a   these prereqs *
7350: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7360: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20  st_item *pSrc,. 
7370: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7380: 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  rBy.){.  int i, 
7390: 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  j;.  int nTerm;.
73a0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
73b0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
73c0: 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
73d0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
73e0: 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64  dex_orderby *pId
73f0: 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75  xOrderBy;.  stru
7400: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7410: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
7420: 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
7430: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
7440: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
7450: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7460: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a  nfo *pIdxInfo;..
7470: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
7480: 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
7490: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
74a0: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
74b0: 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
74c0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
74d0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
74e0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
74f0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7500: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7510: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
7520: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
7530: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
7540: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
7550: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
7560: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
7570: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
7580: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
7590: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
75a0: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
75b0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
75c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
75d0: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
75e0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
75f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7600: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7610: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7620: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7630: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7640: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7650: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
7660: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
7670: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
7680: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
7690: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f  |WO_IS))==0 ) co
76a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
76b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
76c0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
76d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
76e0: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
76f0: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
7700: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
7710: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
7720: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
7730: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
7740: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
7750: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
7760: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
7770: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7780: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
7790: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
77a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
77b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
77c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
77d0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
77e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
77f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
7800: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
7820: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
7830: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
7840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7850: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
7860: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
7870: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
7880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7890: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
78a0: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
78b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
78c0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
78d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
78e0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
78f0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
7900: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7910: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
7920: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
7930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7940: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
7950: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
7960: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
7970: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
79a0: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
79b0: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
79c0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
79d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
79e0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
79f0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
7a00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7a10: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
7a20: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
7a30: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7a40: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
7a50: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
7a60: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
7a70: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
7a80: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
7a90: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
7aa0: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
7ab0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
7ac0: 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
7ad0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
7ae0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
7af0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
7b00: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
7b10: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b20: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7b30: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
7b40: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
7b50: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b60: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
7b70: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
7b80: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
7b90: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7ba0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7bb0: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
7bc0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
7bd0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
7be0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
7bf0: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
7c00: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
7c10: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
7c20: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7c30: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7c40: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
7c50: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
7c60: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
7c70: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7c80: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
7c90: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
7ca0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
7cb0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7cc0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7cd0: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
7ce0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
7cf0: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
7d40: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
7d50: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7d60: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7d70: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
7d80: 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54  8 op;.    if( pT
7d90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7da0: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7db0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7dc0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
7dd0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
7de0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
7df0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
7e00: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
7e10: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7e20: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7e30: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7e40: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7e50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7e60: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7e70: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
7e80: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7e90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ea0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
7eb0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7ec0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7ed0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
7ee0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7ef0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
7f00: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
7f10: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7f20: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7f30: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7f40: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7f50: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7f60: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7f70: 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78  (-1) );.    pIdx
7f80: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
7f90: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
7fa0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
7fb0: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
7fc0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
7fd0: 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
7fe0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
7ff0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
8000: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
8010: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d      if( op==WO_M
8020: 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 6f 70  ATCH ){.      op
8030: 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68   = pTerm->eMatch
8040: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  Op;.    }.    pI
8050: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
8060: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
8070: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
8080: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8090: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
80a0: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
80b0: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
80c0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
80d0: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
80e0: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
80f0: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
8100: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
8110: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
8120: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
8130: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
8140: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
8150: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
8160: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
8170: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
8180: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8190: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
81a0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
81b0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
81c0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
81d0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
81e0: 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
81f0: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
8200: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
8210: 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
8220: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
8230: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8240: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
8250: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8260: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
8270: 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
8280: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8290: 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
82a0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
82b0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
82c0: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
82d0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
82e0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
82f0: 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
8300: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
8310: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
8320: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
8330: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
8340: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
8350: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8360: 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
8370: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
8380: 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
8390: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
83a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
83b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
83c0: 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
83d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
83e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
83f0: 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
8400: 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
8410: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
8420: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
8430: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8440: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
8450: 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
8460: 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
8470: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8480: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8490: 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
84a0: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
84b0: 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
84c0: 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
84d0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
84e0: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
84f0: 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
8500: 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
8510: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
8520: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8530: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8540: 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
8550: 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
8560: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
8570: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
8580: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
8590: 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
85a0: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
85b0: 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
85c0: 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
85d0: 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
85e0: 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
85f0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
8600: 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
8610: 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
8620: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
8630: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
8640: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
8650: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
8660: 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
8670: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
8680: 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
8690: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
86a0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
86b0: 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
86c0: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
86d0: 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
86e0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
86f0: 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
8700: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8710: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8720: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
8730: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
8740: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
8750: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
8760: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
8770: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8780: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
8790: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
87a0: 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
87b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
87c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
87d0: 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
87e0: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
87f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8800: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
8810: 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
8820: 67 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20  g = 0;..#if 0.  
8830: 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73  /* This error is
8840: 20 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74   now caught by t
8850: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20  he caller..  ** 
8860: 53 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73  Search for "xBes
8870: 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
8880: 6f 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66  on" below */.  f
8890: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
88a0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
88b0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
88c0: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
88d0: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
88e0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
88f0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
8900: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8910: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8920: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
8930: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
8940: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
8950: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
8960: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
8970: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50  dif..  return pP
8980: 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
8990: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
89a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
89b0: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
89c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
89d0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
89e0: 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
89f0: 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
8a00: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
8a10: 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
8a20: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
8a30: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
8a40: 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
8a50: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
8a60: 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
8a70: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8a80: 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
8a90: 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Rec.**    aStat[
8aa0: 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
8ab0: 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
8ac0: 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20  l to pRec.**.** 
8ad0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
8ae0: 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74   of the sample t
8af0: 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  hat is the small
8b00: 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a  est sample that.
8b10: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
8b20: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
8b30: 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  Rec. Note that t
8b40: 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  his index is not
8b50: 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74   an index.** int
8b60: 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  o the aSample[] 
8b70: 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e  array - it is an
8b80: 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69   index into a vi
8b90: 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d  rtual set of sam
8ba0: 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ples.** based on
8bb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
8bc0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74   aSample[] and t
8bd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
8be0: 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a  lds in record .*
8bf0: 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74  * pRec. .*/.stat
8c00: 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
8c10: 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
8c20: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8c30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8c40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
8c50: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8c70: 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
8c80: 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
8c90: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
8ca0: 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56  pRec,       /* V
8cb0: 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20  ector of values 
8cc0: 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20  to consider */. 
8cd0: 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20   int roundUp,   
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8cf0: 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65  Round up if true
8d00: 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66  .  Round down if
8d10: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77   false */.  tRow
8d20: 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20  cnt *aStat      
8d30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8d40: 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65  stats written he
8d50: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
8d60: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
8d70: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
8d80: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8da0: 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69  * Index of requi
8db0: 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45  red stats in anE
8dc0: 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  q[] etc. */.  in
8dd0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8df0: 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70  ex of first samp
8e00: 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20  le >= pRec */.  
8e10: 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20  int iSample;    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8e30: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
8e40: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
8e50: 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
8e60: 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e80: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
8e90: 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
8ea0: 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
8ed0: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
8ee0: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
8ef0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
8f00: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
8f10: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
8f20: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
8f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f40: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
8f50: 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77  n pRec */.  tRow
8f60: 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20  cnt iLower = 0; 
8f70: 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b          /* anLt[
8f80: 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61  ] + anEq[] of la
8f90: 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65  rgest sample pRe
8fa0: 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64  c is > */..#ifnd
8fb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8fc0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8fd0: 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
8fe0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
8ff0: 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Rec!=0 );.  asse
9000: 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
9010: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
9020: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
9030: 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c  && pRec->nField<
9040: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  =pIdx->nSampleCo
9050: 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20  l );..  /* Do a 
9060: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
9070: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
9080: 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74  sample greater t
9090: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a  han or equal.  *
90a0: 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52  * to pRec. If pR
90b0: 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ec contains a si
90c0: 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20  ngle field, the 
90d0: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74  set of samples t
90e0: 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73  o search.  ** is
90f0: 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d   simply the aSam
9100: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ple[] array. If 
9110: 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61  the samples in a
9120: 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e  Sample[] contain
9130: 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20   more.  ** than 
9140: 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20  one fields, all 
9150: 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  fields following
9160: 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69   the first are i
9170: 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  gnored..  **.  *
9180: 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  * If pRec contai
9190: 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65  ns N fields, whe
91a0: 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61  re N is more tha
91b0: 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77  n one, then as w
91c0: 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ell as the.  ** 
91d0: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
91e0: 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20  le[] (truncated 
91f0: 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68  to N fields), th
9200: 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61  e search also ha
9210: 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  s to.  ** consid
9220: 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74  er prefixes of t
9230: 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f  hose samples. Fo
9240: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
9250: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
9260: 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65  .  ** in aSample
9270: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
9280: 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20     aSample[0] = 
9290: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
92a0: 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61   aSample[1] = (a
92b0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
92c0: 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c  aSample[2] = (b,
92d0: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53   5) .  **     aS
92e0: 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31  ample[3] = (c, 1
92f0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  00) .  **     aS
9300: 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31  ample[4] = (c, 1
9310: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  05).  **.  ** Th
9320: 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70  en the search sp
9330: 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c  ace should ideal
9340: 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65  ly be the sample
9350: 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20  s above and the 
9360: 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65  .  ** unique pre
9370: 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61  fixes [a], [b] a
9380: 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63  nd [c]. But sinc
9390: 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74  e that is hard t
93a0: 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a  o organize, .  *
93b0: 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61  * the code actua
93c0: 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69  lly searches thi
93d0: 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s set:.  **.  **
93e0: 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a       0: (a) .  *
93f0: 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20  *     1: (a, 5) 
9400: 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c  .  **     2: (a,
9410: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33   10) .  **     3
9420: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
9430: 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a      4: (b) .  **
9440: 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a       5: (b, 5) .
9450: 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20    **     6: (c) 
9460: 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c  .  **     7: (c,
9470: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9480: 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a  8: (c, 105).  **
9490: 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29       9: (c, 105)
94a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
94b0: 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ach sample in th
94c0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
94d0: 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65  y, N samples are
94e0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a   present in the.
94f0: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73    ** effective s
9500: 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20  ample array. In 
9510: 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c  the above, sampl
9520: 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62  es 0 and 1 are b
9530: 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61  ased on .  ** sa
9540: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  mple aSample[0].
9550: 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   Samples 2 and 3
9560: 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65   on aSample[1] e
9570: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  tc..  **.  ** Of
9580: 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66  ten, sample i of
9590: 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e   each block of N
95a0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
95b0: 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65  es has (i+1) fie
95c0: 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74  lds..  ** Except
95d0: 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61  , each sample ma
95e0: 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  y be extended to
95f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20   ensure that it 
9600: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
9610: 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  or.  ** equal to
9620: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61   the previous sa
9630: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61  mple in the arra
9640: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
9650: 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20  in the above, . 
9660: 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20   ** sample 2 is 
9670: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
9680: 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e   of a block of N
9690: 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20   samples, so at 
96a0: 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61  first it .  ** a
96b0: 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73  ppears that it s
96c0: 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64  hould be 1 field
96d0: 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65   in size. Howeve
96e0: 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  r, that would ma
96f0: 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c  ke it .  ** smal
9700: 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ler than sample 
9710: 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79  1, so the binary
9720: 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f   search would no
9730: 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73  t work. As a res
9740: 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73  ult, .  ** it is
9750: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f   extended to two
9760: 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70   fields. The dup
9770: 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69  licates that thi
9780: 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74  s creates do not
9790: 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79   .  ** cause any
97a0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
97b0: 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d    nField = pRec-
97c0: 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20  >nField;.  iCol 
97d0: 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d  = 0;.  iSample =
97e0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a   pIdx->nSample *
97f0: 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20   nField;.  do{. 
9800: 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20     int iSamp;   
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61   /* Index in aSa
9830: 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73  mple[] of test s
9840: 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ample */.    int
9850: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
9860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9870: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
9880: 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  n test sample */
9890: 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  ..    iTest = (i
98a0: 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a  Min+iSample)/2;.
98b0: 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73      iSamp = iTes
98c0: 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  t / nField;.    
98d0: 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20  if( iSamp>0 ){. 
98e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70       /* The prop
98f0: 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73  osed effective s
9900: 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69  ample is a prefi
9910: 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d  x of sample aSam
9920: 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20  ple[iSamp]..    
9930: 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c    ** Specificall
9940: 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20  y, the shortest 
9950: 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61  prefix of at lea
9960: 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46  st (1 + iTest%nF
9970: 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20  ield) .      ** 
9980: 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67  fields that is g
9990: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
99a0: 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69  previous effecti
99b0: 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20  ve sample.  */. 
99c0: 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73       for(n=(iTes
99d0: 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b  t % nField) + 1;
99e0: 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b   n<nField; n++){
99f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
9a00: 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e  mple[iSamp-1].an
9a10: 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65  Lt[n-1]!=aSample
9a20: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
9a30: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
9a40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9a50: 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20      n = iTest + 
9a60: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52  1;.    }..    pR
9a70: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a  ec->nField = n;.
9a80: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
9a90: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
9aa0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  re(aSample[iSamp
9ab0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61  ].n, aSample[iSa
9ac0: 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  mp].p, pRec);.  
9ad0: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
9ae0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9af0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9b00: 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65  t[n-1] + aSample
9b10: 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31  [iSamp].anEq[n-1
9b20: 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ];.      iMin = 
9b30: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
9b40: 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  se if( res==0 &&
9b50: 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20   n<nField ){.   
9b60: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
9b70: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9b80: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9b90: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9ba0: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
9bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61  }else{.      iSa
9bc0: 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20  mple = iTest;.  
9bd0: 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a      iCol = n-1;.
9be0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9bf0: 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d  res && iMin<iSam
9c00: 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61  ple );.  i = iSa
9c10: 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a  mple / nField;..
9c20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9c30: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
9c40: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
9c50: 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
9c60: 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
9c70: 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
9c80: 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
9c90: 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
9ca0: 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
9cb0: 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
9cc0: 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
9cd0: 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
9ce0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
9cf0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9d00: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iled==0 ){.    i
9d10: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
9d20: 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30     /* If (res==0
9d30: 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ) is true, then 
9d40: 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75  pRec must be equ
9d50: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20  al to sample i. 
9d60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9d70: 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
9d80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9d90: 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31  ( iCol==nField-1
9da0: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9db0: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
9dc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
9dd0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
9de0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9df0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
9e00: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20  [i].p, pRec) .  
9e10: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
9e20: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9e30: 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20  iled .      );. 
9e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e50: 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64  /* Unless i==pId
9e60: 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69  x->nSample, indi
9e70: 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63  cating that pRec
9e80: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
9e90: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d        ** all sam
9ea0: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d  ples in the aSam
9eb0: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65  ple[] array, pRe
9ec0: 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
9ed0: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
9ee0: 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65   ** (iCol+1) fie
9ef0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
9f00: 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20  ple i.  */.     
9f10: 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78   assert( i<=pIdx
9f20: 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d  ->nSample && i>=
9f30: 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  0 );.      pRec-
9f40: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31  >nField = iCol+1
9f50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9f60: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9f70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
9f80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9f90: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9fa0: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9fb0: 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
9fc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9fd0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9fe0: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  led );..      /*
9ff0: 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f   if i==0 and iCo
a000: 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72  l==0, then recor
a010: 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65  d pRec is smalle
a020: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
a030: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  es.      ** in t
a040: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
a050: 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
a060: 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20  f (iCol>0) then 
a070: 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20  pRec must.      
a080: 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ** be greater th
a090: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
a0a0: 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20  he (iCol) field 
a0b0: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
a0c0: 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   i..      ** If 
a0d0: 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63  (i>0), then pRec
a0e0: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72   must also be gr
a0f0: 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  eater than sampl
a100: 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20  e (i-1).  */.   
a110: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
a120: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a130: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20  Field = iCol;.  
a140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a150: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a160: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a170: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
a180: 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20  p, pRec)<=0.    
a190: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
a1a0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
a1b0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  iled );.      }.
a1c0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
a1d0: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a1e0: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
a1f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a200: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
a210: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
a220: 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  [i-1].n, aSample
a230: 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30  [i-1].p, pRec)<0
a240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a250: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a260: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
a280: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
a290: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
a2a0: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
a2b0: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52      /* Record pR
a2c0: 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73  ec is equal to s
a2d0: 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61  ample i */.    a
a2e0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
a2f0: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74  eld-1 );.    aSt
a300: 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
a310: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
a320: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
a330: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
a340: 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol];.  }else{.  
a350: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
a360: 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29  nt, the (iCol+1)
a370: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
a380: 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
a390: 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a  he first .    **
a3a0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
a3b0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65  greater than pRe
a3c0: 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64  c. Or, if i==pId
a3d0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20  x->nSample then 
a3e0: 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c  pRec.    ** is l
a3f0: 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  arger than all s
a400: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72  amples in the ar
a410: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ray. */.    tRow
a420: 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70  cnt iUpper, iGap
a430: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  ;.    if( i>=pId
a440: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  x->nSample ){.  
a450: 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c      iUpper = sql
a460: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
a470: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
a480: 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t[0]);.    }else
a490: 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
a4a0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
a4b0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCol];.    }.. 
a4c0: 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
a4d0: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
a4e0: 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
a4f0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
a500: 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
a510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a520: 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
a530: 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
a540: 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
a550: 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
a560: 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
a570: 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
a580: 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61  + iGap;.    aSta
a590: 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76  t[1] = pIdx->aAv
a5a0: 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a  gEq[iCol];.  }..
a5b0: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
a5c0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
a5d0: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
a5e0: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
a5f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
a600: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
a610: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a620: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
a630: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
a640: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
a650: 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
a660: 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
a670: 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
a680: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
a690: 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
a6a0: 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
a6b0: 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
a6c0: 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
a6d0: 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
a6e0: 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
a6f0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a700: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
a710: 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
a720: 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
a730: 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
a740: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
a750: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
a760: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
a770: 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
a780: 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
a790: 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
a7a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
a7b0: 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
a7c0: 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
a7d0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
a7e0: 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
a7f0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
a800: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
a810: 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
a820: 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
a830: 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
a840: 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
a850: 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
a860: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
a870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
a880: 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
a890: 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
a8a0: 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
a8b0: 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
a8c0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
a8d0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
a8e0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
a8f0: 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
a900: 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
a910: 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
a920: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
a930: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
a940: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
a950: 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
a960: 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
a970: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
a980: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
a990: 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a  eturn nRet;.}...
a9a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a9b0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a9c0: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
a9d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f   the affinity fo
a9e0: 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  r a single colum
a9f0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  n of an index..*
aa00: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71  /.static char sq
aa10: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
aa20: 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33  Affinity(sqlite3
aa30: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
aa40: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
aa50: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
aa60: 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43  && iCol<pIdx->nC
aa70: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21  olumn );.  if( !
aa80: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  pIdx->zColAff ){
aa90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
aaa0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
aab0: 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20  (db, pIdx)==0 ) 
aac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
aad0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
aae0: 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41  turn pIdx->zColA
aaf0: 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64  ff[iCol];.}.#end
ab00: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
ab10: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ab20: 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20  OR_STAT4./* .** 
ab30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ab40: 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d   called to estim
ab50: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
ab60: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  f rows visited b
ab70: 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61  y a.** range-sca
ab80: 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e  n on a skip-scan
ab90: 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d   index. For exam
aba0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ple:.**.**   CRE
abb0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
abc0: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20  t1(a, b, c);.** 
abd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
abe0: 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  t1 WHERE a=? AND
abf0: 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44   c BETWEEN ? AND
ac00: 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20   ?;.**.** Value 
ac10: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63  pLoop->nOut is c
ac20: 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
ac30: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
ac40: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a  mber of rows .**
ac50: 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61   visited for sca
ac60: 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62  nning (a=? AND b
ac70: 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69  =?). This functi
ac80: 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20  on reduces that 
ac90: 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20  estimate .** by 
aca0: 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61  some factor to a
acb0: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28  ccount for the (
acc0: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
acd0: 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61  ?) expression ba
ace0: 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  sed.** on the st
acf0: 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65  at4 data for the
ad00: 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61   index. this sca
ad10: 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d  n will be peform
ad20: 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
ad30: 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20  times (once for 
ad40: 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69  each (a,b) combi
ad50: 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63  nation that matc
ad60: 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c  hes a=?) is deal
ad70: 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68  t with .** by th
ad80: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
ad90: 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20  It does this by 
ada0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
adb0: 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c   all stat4 sampl
adc0: 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61  es, comparing va
add0: 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65  lues.** extracte
ade0: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
adf0: 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68  d pUpper with th
ae00: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
ae10: 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a  column in each.*
ae20: 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61  * sample. If L a
ae30: 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d  nd U are the num
ae40: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66  ber of samples f
ae50: 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20  ound to be less 
ae60: 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c  than or.** equal
ae70: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65   to the values e
ae80: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
ae90: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
aea0: 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e  respectively, an
aeb0: 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f  d.** N is the to
aec0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
aed0: 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70  mples, the pLoop
aee0: 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20  ->nOut value is 
aef0: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66  adjusted.** as f
af00: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
af10: 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20  nOut = nOut * ( 
af20: 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20  min(U - L, 1) / 
af30: 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f  N ).**.** If pLo
af40: 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  wer is NULL, or 
af50: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
af60: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
af70: 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a   the term, L is.
af80: 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ** set to zero. 
af90: 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c  If pUpper is NUL
afa0: 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61  L, or a value ca
afb0: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
afc0: 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20  d from it,.** U 
afd0: 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a  is set to N..**.
afe0: 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  ** Normally, thi
aff0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
b000: 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66  *pbDone to 1 bef
b010: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48  ore returning. H
b020: 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f  owever,.** if no
b030: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78   value can be ex
b040: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74  tracted from eit
b050: 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55  her pLower or pU
b060: 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65  pper (and so the
b070: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20  .** estimate of 
b080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b090: 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d  ws delivered rem
b0a0: 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c  ains unchanged),
b0b0: 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c   *pbDone.** is l
b0c0: 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a  eft as is..**.**
b0d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
b0e0: 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
b0f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
b100: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
b110: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  , .** SQLITE_OK.
b120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b130: 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61  hereRangeSkipSca
b140: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
b150: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
b160: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
b170: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
b180: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
b190: 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
b1a0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
b1b0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
b1c0: 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
b1d0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
b1e0: 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
b1f0: 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
b200: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
b210: 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
b220: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ULL */.  WhereLo
b230: 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a  op *pLoop,    /*
b240: 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75   Update the .nOu
b250: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  t value of this 
b260: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  loop */.  int *p
b270: 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f  bDone          /
b280: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
b290: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78   at least one ex
b2a0: 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63  pr. value extrac
b2b0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ted */.){.  Inde
b2c0: 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
b2d0: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
b2e0: 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
b2f0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
b300: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b310: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b320: 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69  nLower = -1;.  i
b330: 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e  nt nUpper = p->n
b340: 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20  Sample+1;.  int 
b350: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b360: 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74    u8 aff = sqlit
b370: 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66  e3IndexColumnAff
b380: 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71  inity(db, p, nEq
b390: 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  );.  CollSeq *pC
b3a0: 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  oll;.  .  sqlite
b3b0: 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b  3_value *p1 = 0;
b3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
b3d0: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
b3e0: 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71  m pLower */.  sq
b3f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20  lite3_value *p2 
b400: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
b410: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
b420: 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a   from pUpper */.
b430: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
b440: 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pVal = 0;      
b450: 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
b460: 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64  cted from record
b470: 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73   */..  pColl = s
b480: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b490: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61  Seq(pParse, p->a
b4a0: 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69  zColl[nEq]);.  i
b4b0: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
b4c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
b4d0: 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
b4e0: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e  pParse, pLower->
b4f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
b500: 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c  ff, &p1);.    nL
b510: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ower = 0;.  }.  
b520: 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63  if( pUpper && rc
b530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b550: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b560: 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72  r(pParse, pUpper
b570: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b580: 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20   aff, &p2);.    
b590: 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20  nUpper = p2 ? 0 
b5a0: 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20  : p->nSample;.  
b5b0: 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70  }..  if( p1 || p
b5c0: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
b5d0: 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20      int nDiff;. 
b5e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
b5f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
b600: 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
b610: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b620: 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64  te3Stat4Column(d
b630: 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  b, p->aSample[i]
b640: 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  .p, p->aSample[i
b650: 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29  ].n, nEq, &pVal)
b660: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
b670: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20  SQLITE_OK && p1 
b680: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b690: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b6a0: 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c  ompare(p1, pVal,
b6b0: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b6c0: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c   if( res>=0 ) nL
b6d0: 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ower++;.      }.
b6e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b6f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b  LITE_OK && p2 ){
b700: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
b710: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
b720: 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70  pare(p2, pVal, p
b730: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
b740: 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70  f( res>=0 ) nUpp
b750: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
b760: 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20    }.    nDiff = 
b770: 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72  (nUpper - nLower
b780: 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66  );.    if( nDiff
b790: 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b  <=0 ) nDiff = 1;
b7a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
b7b0: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
b7c0: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  er and lower bou
b7d0: 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e  nd specified, an
b7e0: 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  d the .    ** co
b7f0: 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61  mparisons indica
b800: 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65  te that they are
b810: 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c   close together,
b820: 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63   use the fallbac
b830: 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20  k.    ** method 
b840: 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65  (assume that the
b850: 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36   scan visits 1/6
b860: 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66  4 of the rows) f
b870: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20  or estimating.  
b880: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
b890: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e  of rows visited.
b8a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69   Otherwise, esti
b8b0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
b8c0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75  of rows.    ** u
b8d0: 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20  sing the method 
b8e0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
b8f0: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
b900: 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
b910: 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44  n. */.    if( nD
b920: 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72  iff!=1 || pUpper
b930: 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30  ==0 || pLower==0
b940: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
b950: 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33  djust = (sqlite3
b960: 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c  LogEst(p->nSampl
b970: 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45  e) - sqlite3LogE
b980: 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20  st(nDiff));.    
b990: 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d    pLoop->nOut -=
b9a0: 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20   nAdjust;.      
b9b0: 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  *pbDone = 1;.   
b9c0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
b9d0: 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70  10, ("range skip
b9e0: 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25  -scan regions: %
b9f0: 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64  u..%u  adjust=%d
ba00: 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e         nLower, n
ba30: 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d  Upper, nAdjust*-
ba40: 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29  1, pLoop->nOut))
ba50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
ba60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  {.    assert( *p
ba70: 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a  bDone==0 );.  }.
ba80: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
ba90: 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74  ree(p1);.  sqlit
baa0: 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b  e3ValueFree(p2);
bab0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
bac0: 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
bad0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
bae0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
baf0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
bb00: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  4 */../*.** This
bb10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
bb20: 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
bb30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
bb40: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
bb50: 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
bb60: 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
bb70: 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
bb80: 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
bb90: 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
bba0: 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
bbb0: 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
bbc0: 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
bbd0: 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
bbe0: 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
bbf0: 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
bc00: 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
bc10: 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
bc20: 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
bc30: 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
bc40: 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
bc50: 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
bc60: 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
bc70: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
bc80: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
bc90: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
bca0: 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
bcb0: 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
bce0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
bcf0: 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
bd00: 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
bd10: 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
bd20: 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
bd30: 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
bd40: 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
bd50: 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
bd60: 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
bd70: 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
bd80: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
bd90: 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64  value in (pBuild
bda0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
bdb0: 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75  e.nEq) is the nu
bdc0: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
bdd0: 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  x.** column subj
bde0: 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65  ect to the range
bdf0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c   constraint. Or,
be00: 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74   equivalently, t
be10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
be20: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
be30: 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62  ints optimized b
be40: 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69  y the proposed i
be50: 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65  ndex scan. For e
be60: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d  xample,.** assum
be70: 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f  ing index p is o
be80: 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20  n t1(a, b), and 
be90: 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73  the SQL query is
bea0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
beb0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
bec0: 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20  ? AND b > ? AND 
bed0: 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  b < ? ....**.** 
bee0: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
bef0: 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  to 1 (as the ran
bf00: 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
bf10: 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20  lumn, b, is the 
bf20: 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d  second .** left-
bf30: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
bf40: 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69  he index). Or, i
bf50: 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
bf60: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
bf70: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
bf80: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
bf90: 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
bfa0: 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
bfb0: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
bfc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
bfd0: 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
bfe0: 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  he sqlite3LogEst
bff0: 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  () of the.** num
c000: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
c010: 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
c020: 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76  is expected to v
c030: 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a  isit without .**
c040: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65   considering the
c050: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
c060: 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c  ts. If nEq is 0,
c070: 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20   then *pnOut is 
c080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
c090: 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * rows in the in
c0a0: 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
c0b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
c0c0: 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65  pnOut is adjuste
c0d0: 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74  d (reduced).** t
c0e0: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
c0f0: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
c100: 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  nts pLower and p
c110: 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e  Upper..** .** In
c120: 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
c130: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41  sqlite_stat4 ANA
c140: 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66  LYZE data, or if
c150: 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f   such data canno
c160: 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20  t be.** used, a 
c170: 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65  single range ine
c180: 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
c190: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
c1a0: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
c1b0: 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69  4. .** and a pai
c1c0: 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
c1d0: 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
c1e0: 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63  educes the expec
c1f0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  ted number of.**
c200: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
c210: 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e   a factor of 64.
c220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c230: 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
c240: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c250: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
c260: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
c270: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
c280: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
c290: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
c2a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
c2b0: 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
c2c0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c2d0: 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
c2e0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c2f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
c300: 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
c310: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
c320: 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
c330: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c340: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
c350: 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66  oop     /* Modif
c360: 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20  y the .nOut and 
c370: 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c  maybe .rRun fiel
c380: 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ds */.){.  int r
c390: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c3a0: 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f   int nOut = pLoo
c3b0: 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73  p->nOut;.  LogEs
c3c0: 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  t nNew;..#ifdef 
c3d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c3e0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49  AT3_OR_STAT4.  I
c3f0: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
c400: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
c410: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
c420: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
c430: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  ..  if( p->nSamp
c440: 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e  le>0 && nEq<p->n
c450: 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20  SampleCol ){.   
c460: 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64   if( nEq==pBuild
c470: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b  er->nRecValid ){
c480: 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52  .      UnpackedR
c490: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
c4a0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
c4b0: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
c4c0: 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a  ;.      u8 aff;.
c4d0: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
c4e0: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
c4f0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c500: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c510: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
c520: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
c530: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
c540: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c550: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
c560: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
c570: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
c580: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
c590: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
c5a0: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
c5b0: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
c5c0: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
c5d0: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
c5e0: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
c5f0: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
c600: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
c610: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c620: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
c630: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
c640: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
c650: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
c660: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
c670: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
c680: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
c690: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
c6a0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
c6b0: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
c6c0: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
c6d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
c6e0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c6f0: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
c700: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
c710: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
c720: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
c730: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
c740: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
c750: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c760: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
c770: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
c780: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
c790: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
c7a0: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
c7b0: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
c7c0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c7d0: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
c7e0: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
c7f0: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
c800: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
c810: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
c820: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
c830: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
c840: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
c850: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
c860: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
c870: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
c880: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
c890: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
c8a0: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
c8b0: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
c8c0: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
c8d0: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
c8e0: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
c8f0: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
c900: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c910: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
c920: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
c930: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
c940: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
c950: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
c960: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
c970: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
c980: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
c990: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
c9a0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
c9b0: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
c9c0: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
c9d0: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
c9e0: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
c9f0: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
ca00: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
ca10: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ca20: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
ca30: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
ca40: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
ca50: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
ca60: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
ca70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ca80: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
ca90: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
caa0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
cab0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
cac0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
cad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
cae0: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
caf0: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
cb00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e  pParse->db, p, n
cb10: 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
cb20: 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79 43  t( nEq!=p->nKeyC
cb30: 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ol || aff==SQLIT
cb40: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
cb50: 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
cb60: 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
cb70: 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
cb80: 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
cb90: 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20  if( nEq==0 ){.  
cba0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
cbb0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
cbc0: 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a   = p->nRowEst0;.
cbd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cbe0: 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
cbf0: 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
cc00: 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
cc10: 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
cc20: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
cc30: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
cc40: 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
cc50: 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
cc60: 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
cc70: 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
cc80: 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
cc90: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
cca0: 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
ccb0: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
ccc0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
ccd0: 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
cce0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
ccf0: 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30  ssert( pLower==0
cd00: 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   || (pLower->eOp
cd10: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
cd20: 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
cd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
cd40: 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
cd50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
cd60: 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
cd70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cd80: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d   p->aSortOrder!=
cd90: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
cda0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
cdb0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
cdc0: 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f  The roles of pLo
cdd0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61  wer and pUpper a
cde0: 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61  re swapped for a
cdf0: 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20   DESC index */. 
ce00: 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72         SWAP(Wher
ce10: 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20  eTerm*, pLower, 
ce20: 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d  pUpper);.      }
ce30: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
ce40: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
ce50: 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
ce60: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
ce70: 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
ce80: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
ce90: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
cec0: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
ced0: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
cee0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
cef0: 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
cf00: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
cf10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
cf20: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
cf30: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
cf40: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
cf50: 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
cf60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cf70: 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
cf80: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
cf90: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cfa0: 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
cfb0: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
cfc0: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
cfe0: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
cff0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
d000: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
d010: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d020: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
d030: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
d040: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d050: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d060: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
d070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d080: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
d090: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
d0a0: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
d0b0: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
d0c0: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
d0d0: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
d0e0: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
d110: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
d120: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
d130: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
d140: 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
d150: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
d160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
d170: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
d180: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
d190: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
d1a0: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
d1b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d1c0: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
d1d0: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
d1e0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d1f0: 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iUprIdx = whereK
d200: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d210: 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
d220: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
d230: 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
d240: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
d250: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
d260: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
d270: 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70      if( iNew<iUp
d280: 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69  per ) iUpper = i
d290: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
d2a0: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
d2b0: 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20   pUpper = 0;.   
d2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
d2d0: 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
d2e0: 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
d2f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d310: 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
d320: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  r ){.          n
d330: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  New = sqlite3Log
d340: 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  Est(iUpper - iLo
d350: 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wer);.          
d360: 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62  /* TUNING:  If b
d370: 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69  oth iUpper and i
d380: 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65  Lower are derive
d390: 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  d from the same.
d3a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
d3b0: 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  ple, then assume
d3c0: 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72   they are 4x mor
d3d0: 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68  e selective.  Th
d3e0: 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20  is brings.      
d3f0: 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d      ** the estim
d400: 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79  ated selectivity
d410: 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69   more in line wi
d420: 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64  th what it would
d430: 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
d440: 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69   if estimated wi
d450: 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66  thout the use of
d460: 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e   STAT3/4 tables.
d470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d480: 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49  ( iLwrIdx==iUprI
d490: 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  dx ) nNew -= 20;
d4a0: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
d4b0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
d4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
d4e0: 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 10;        ass
d4f0: 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
d500: 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
d510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d520: 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
d530: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d            nOut =
d540: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
d550: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
d560: 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54  ACE(0x10, ("STAT
d570: 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75  4 range scan: %u
d580: 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c  ..%u  est=%d\n",
d590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
d5b0: 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
d5c0: 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
d5d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d5e0: 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65  .      int bDone
d5f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
d600: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
d610: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
d620: 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70  Lower, pUpper, p
d630: 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20  Loop, &bDone);. 
d640: 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29       if( bDone )
d650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d660: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
d670: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d680: 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
d690: 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c  _PARAMETER(pBuil
d6a0: 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  der);.  assert( 
d6b0: 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
d6c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
d6d0: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
d6e0: 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61  | (pUpper->wtFla
d6f0: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
d700: 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  ==0 );.  nNew = 
d710: 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
d720: 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a  (pLower, nOut);.
d730: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
d740: 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72  ngeAdjust(pUpper
d750: 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54  , nNew);..  /* T
d760: 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
d770: 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
d780: 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74   and lower limit
d790: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d   and neither lim
d7a0: 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61  it.  ** has an a
d7b0: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
d7c0: 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  ed likelihood(),
d7d0: 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
d7e0: 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
d7f0: 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
d800: 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
d810: 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
d820: 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
d830: 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
d840: 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
d850: 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
d860: 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
d870: 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
d880: 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
d890: 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
d8a0: 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
d8b0: 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
d8c0: 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
d8d0: 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
d8e0: 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
d8f0: 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77  ( pLower && pLow
d900: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
d910: 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70  && pUpper && pUp
d920: 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  per->truthProb>0
d930: 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
d940: 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20  20;.  }..  nOut 
d950: 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b  -= (pLower!=0) +
d960: 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20   (pUpper!=0);.  
d970: 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e  if( nNew<10 ) nN
d980: 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e  ew = 10;.  if( n
d990: 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20  New<nOut ) nOut 
d9a0: 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69  = nNew;.#if defi
d9b0: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
d9c0: 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c  NABLED).  if( pL
d9d0: 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  oop->nOut>nOut )
d9e0: 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
d9f0: 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63  (0x10,("Range sc
da00: 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66  an lowers nOut f
da10: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
da20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da30: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
da40: 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65  , nOut));.  }.#e
da50: 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ndif.  pLoop->nO
da60: 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
da70: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
da80: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
da90: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
daa0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
dab0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
dac0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
dad0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
dae0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
daf0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
db00: 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
db10: 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
db20: 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
db30: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
db40: 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
db50: 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
db60: 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
db70: 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
db80: 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
db90: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
dba0: 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
dbb0: 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
dbc0: 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
dbd0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
dbe0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
dbf0: 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
dc00: 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
dc10: 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
dc20: 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
dc30: 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
dc40: 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
dc50: 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
dc60: 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
dc70: 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
dc80: 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
dc90: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
dca0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
dcb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
dcc0: 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
dcd0: 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
dce0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
dcf0: 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
dd00: 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
dd10: 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
dd20: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
dd30: 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
dd40: 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
dd50: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
dd60: 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
dd70: 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
dd80: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
dd90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
dda0: 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
ddb0: 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
ddc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ddd0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
dde0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
ddf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
de00: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
de10: 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
de20: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
de30: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
de40: 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
de50: 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
de60: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
de70: 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
de80: 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
de90: 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
dea0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
deb0: 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
dec0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
ded0: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
dee0: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
def0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
df00: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
df10: 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
df20: 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
df50: 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
df60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df70: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
df80: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
df90: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
dfa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dfb0: 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
dfc0: 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
dfd0: 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
dfe0: 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
dff0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
e000: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e010: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e020: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
e030: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
e040: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
e050: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
e060: 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
e070: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
e080: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
e090: 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
e0a0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
e0b0: 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
e0c0: 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
e0d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e0e0: 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
e0f0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e100: 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
e110: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e120: 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
e130: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
e140: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
e150: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
e160: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e170: 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
e180: 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
e190: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
e1a0: 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
e1b0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
e1c0: 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
e1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e1e0: 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 73  ;.  }..  aff = s
e1f0: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
e200: 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  nAffinity(pParse
e210: 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29 3b  ->db, p, nEq-1);
e220: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
e230: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e240: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
e250: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
e260: 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
e270: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
e280: 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
e290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e2a0: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
e2b0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
e2c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
e2d0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e2e0: 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
e2f0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
e300: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
e310: 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
e320: 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
e330: 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25  y scan regions %
e340: 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20  s(%d): %d\n",.  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31   p->zName, nEq-1
e370: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
e380: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
e390: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
e3a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e3b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e3c0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
e3d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e3e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e3f0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e400: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
e410: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
e420: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
e430: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
e440: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
e450: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e460: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e470: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
e480: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
e490: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
e4a0: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
e4b0: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
e4c0: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
e4d0: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
e4e0: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
e4f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
e500: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
e510: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
e520: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
e530: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
e540: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
e550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e560: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
e570: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
e580: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
e590: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
e5a0: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
e5b0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
e5c0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
e5d0: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
e5e0: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
e5f0: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
e600: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
e610: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
e620: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
e630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
e640: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
e650: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
e660: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e670: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
e680: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
e690: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e6a0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
e6b0: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
e6c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
e6d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
e6e0: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
e6f0: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
e700: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
e710: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
e720: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
e730: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
e740: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
e750: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
e760: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
e770: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
e780: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
e790: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
e7a0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
e7b0: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
e7c0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e7d0: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
e7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
e7f0: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
e800: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
e810: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
e820: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e830: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
e840: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
e850: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
e860: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
e870: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
e880: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
e890: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e8a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e8b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e8c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
e8d0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
e8e0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e8f0: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
e900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e910: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
e920: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
e930: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
e940: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
e950: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
e960: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
e970: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
e980: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e990: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
e9a0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
e9b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e9c0: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
e9d0: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
e9e0: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
e9f0: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
ea00: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
ea10: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
ea20: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
ea30: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
ea40: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ea50: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
ea60: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
ea70: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
ea80: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
ea90: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
eaa0: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
eab0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
eac0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
ead0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
eae0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
eaf0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
eb00: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
eb10: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
eb20: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
eb30: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
eb40: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
eb50: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
eb60: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
eb70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
eb80: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68  zType[4];.    ch
eb90: 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20  ar zLeft[50];.  
eba0: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
ebb0: 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
ebc0: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
ebd0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
ebe0: 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
ebf0: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
ec00: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
ec10: 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
ec20: 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
ec30: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ec40: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
ec50: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
ec60: 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
ec70: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ec80: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
ec90: 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  GLE ){.      sql
eca0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
ecb0: 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66  zeof(zLeft),zLef
ecc0: 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22  t,"left={%d:%d}"
ecd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ece0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
ecf0: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
ed00: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29  m->u.leftColumn)
ed10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ed20: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
ed30: 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26  r & WO_OR)!=0 &&
ed40: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
ed50: 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o!=0 ){.      sq
ed60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
ed70: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ed80: 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30 78  ft,"indexable=0x
ed90: 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20 20  %lld", .        
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
edb0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
edc0: 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20 20  >indexable);.   
edd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ede0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
edf0: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ee00: 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70 54  ft,"left=%d", pT
ee10: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
ee20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ee30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
ee40: 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33         "TERM-%-3
ee50: 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70 72  d %p %s %-12s pr
ee60: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
ee70: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
ee80: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72  \n",.       iTer
ee90: 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
eea0: 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74   zLeft, pTerm->t
eeb0: 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20  ruthProb,.      
eec0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
eed0: 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  r, pTerm->wtFlag
eee0: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  s);.    sqlite3T
eef0: 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 70  reeViewExpr(0, p
ef00: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Term->pExpr, 0);
ef10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
ef20: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
ef30: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
ef40: 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  how the complete
ef50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68   content of a Wh
ef60: 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69  ereClause.*/.voi
ef70: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c  d sqlite3WhereCl
ef80: 61 75 73 65 50 72 69 6e 74 28 57 68 65 72 65 43  ausePrint(WhereC
ef90: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
efa0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
efb0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
efc0: 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65 54 65  ++){.    whereTe
efd0: 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b  rmPrint(&pWC->a[
efe0: 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65  i], i);.  }.}.#e
eff0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45  ndif..#ifdef WHE
f000: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f010: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68  /*.** Print a Wh
f020: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66  ereLoop object f
f030: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72  or debugging pur
f040: 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
f050: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72  void whereLoopPr
f060: 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  int(WhereLoop *p
f070: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
f080: 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  WC){.  WhereInfo
f090: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
f0a0: 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62  pWInfo;.  int nb
f0b0: 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54   = 1+(pWInfo->pT
f0c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f  abList->nSrc+3)/
f0d0: 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  4;.  struct SrcL
f0e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
f0f0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
f100: 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b  st->a + p->iTab;
f110: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
f120: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
f130: 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28  Bitmask mAll = (
f140: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e  ((Bitmask)1)<<(n
f150: 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c  b*4)) - 1;.  sql
f160: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f170: 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
f180: 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
f1b0: 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
f1c0: 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20 6d 41  , p->prereq & mA
f1d0: 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ll);.  sqlite3De
f1e0: 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
f1f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f200: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
f210: 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
f220: 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
f230: 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
f240: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f250: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
f260: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
f270: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
f280: 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
f290: 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
f2a0: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
f2b0: 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
f2c0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
f2d0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
f2e0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
f2f0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
f300: 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
f310: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
f320: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
f330: 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
f340: 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
f350: 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
f360: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f370: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
f380: 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
f390: 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
f3a0: 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
f3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f3c0: 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
f3d0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
f3e0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
f3f0: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
f400: 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
f410: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f420: 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
f430: 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
f440: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
f450: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
f460: 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
f470: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
f480: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f490: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f4a0: 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
f4b0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
f4c0: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
f4d0: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
f4e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f4f0: 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
f500: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f510: 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
f520: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
f530: 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
f540: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
f550: 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
f560: 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
f570: 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
f580: 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
f590: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
f5a0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
f5b0: 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
f5c0: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
f5d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
f5e0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
f5f0: 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
f600: 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
f610: 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
f620: 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
f630: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
f640: 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
f650: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
f660: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f670: 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
f680: 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
f690: 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
f6a0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
f6b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
f6c0: 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
f6d0: 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
f6e0: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
f6f0: 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
f700: 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
f710: 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
f720: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f730: 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
f740: 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
f750: 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
f760: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
f770: 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
f780: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
f790: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
f7a0: 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
f7b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
f7c0: 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
f7d0: 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
f7e0: 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
f7f0: 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
f800: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
f810: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
f820: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f830: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
f840: 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
f850: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
f860: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
f870: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
f880: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f890: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
f8a0: 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
f8b0: 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
f8c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
f8d0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
f8e0: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
f8f0: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
f900: 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
f910: 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
f920: 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
f930: 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
f940: 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
f950: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
f960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f980: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
f990: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
f9a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f9b0: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
f9c0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
f9d0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
f9e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
f9f0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
fa00: 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
fa10: 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
fa20: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
fa30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
fa40: 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
fa50: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
fa60: 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
fa70: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fa80: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fa90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
faa0: 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
fab0: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
fac0: 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
fad0: 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
fae0: 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
faf0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
fb00: 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
fb10: 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
fb20: 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
fb30: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
fb40: 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
fb50: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
fb60: 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
fb70: 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
fb80: 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
fb90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fba0: 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
fbb0: 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
fbc0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
fbd0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  NN(db, sizeof(p-
fbe0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
fbf0: 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
fc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fc10: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
fc20: 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
fc30: 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
fc40: 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
fc50: 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
fc60: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fc70: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fc80: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
fc90: 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
fca0: 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
fcb0: 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
fcc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fcd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
fce0: 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
fcf0: 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
fd00: 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
fd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
fd20: 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
fd30: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
fd40: 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
fd50: 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
fd60: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
fd70: 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
fd80: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
fd90: 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
fda0: 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
fdb0: 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
fdc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
fdd0: 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
fde0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
fdf0: 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  PT;.  }.  memcpy
fe00: 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45  (pTo, pFrom, WHE
fe10: 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29  RE_LOOP_XFER_SZ)
fe20: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
fe30: 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61  aLTerm, pFrom->a
fe40: 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65  LTerm, pTo->nLTe
fe50: 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61  rm*sizeof(pTo->a
fe60: 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66  LTerm[0]));.  if
fe70: 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73  ( pFrom->wsFlags
fe80: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
fe90: 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72  TABLE ){.    pFr
fea0: 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  om->u.vtab.needF
feb0: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
fec0: 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46   if( (pFrom->wsF
fed0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
fee0: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
fef0: 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65     pFrom->u.btre
ff00: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
ff10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ff20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ff30: 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f  elete a WhereLoo
ff40: 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  p object.*/.stat
ff50: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
ff60: 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  pDelete(sqlite3 
ff70: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
ff80: 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  p){.  whereLoopC
ff90: 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73  lear(db, p);.  s
ffa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ffb0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
ffc0: 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
ffd0: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
ffe0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
fff0: 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
10000 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
10010 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
10020 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
10030 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10040 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
10050 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
10060 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20       WhereLevel 
10070 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
10080 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  o->a[i];.      i
10090 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
100a0 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
100b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
100c0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
100d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
100e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
100f0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
10100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10110 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
10120 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
10130 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
10140 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
10150 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
10160 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
10170 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
10180 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
10190 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
101a0 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
101b0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
101c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
101d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
101e0 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nfo);.  }.}../*.
101f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10200 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
10210 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10220 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
10230 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
10240 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
10250 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
10260 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10270 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20   of Y.**   (3)  
10280 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74  X skips at least
10290 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   as many columns
102a0 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   as Y.**.** By "
102b0 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
102c0 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
102d0 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
102e0 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
102f0 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
10300 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
10310 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
10320 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
10330 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
10340 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
10350 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
10360 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
10370 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
10380 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
10390 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
103a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
103b0 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
103c0 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
103d0 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
103e0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
103f0 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69  justed.  The thi
10400 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61  rd rule.** was a
10410 64 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20  dded because if 
10420 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e  X uses skip-scan
10430 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20   less than Y it 
10440 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64  still might.** d
10450 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63  eserve a lower c
10460 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69  ost even if it i
10470 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10480 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  t of Y..*/.stati
10490 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
104a0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
104b0 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
104c0 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
104d0 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
104e0 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
104f0 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
10500 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
10510 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
10520 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
10530 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
10540 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
10550 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d  erm-pX->nSkip >=
10560 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e   pY->nLTerm-pY->
10570 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74  nSkip ){.    ret
10580 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e  urn 0; /* X is n
10590 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
105a0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59   */.  }.  if( pY
105b0 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53  ->nSkip > pX->nS
105c0 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  kip ) return 0;.
105d0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
105e0 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
105f0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
10600 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
10610 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
10620 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
10630 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
10640 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
10650 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
10660 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
10670 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
10680 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
10690 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
106a0 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d    if( pX->aLTerm
106b0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
106c0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  e;.    for(j=pY-
106d0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
106e0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
106f0 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
10700 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
10710 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10720 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
10730 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
10740 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
10750 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
10760 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
10770 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
10780 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
10790 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
107a0 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
107b0 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
107c0 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
107d0 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
107e0 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
107f0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
10800 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
10810 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
10820 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
10830 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
10840 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
10850 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
10860 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
10870 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10880 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
10890 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
108a0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
108b0 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
108c0 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
108d0 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
108e0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
108f0 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
10900 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
10910 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
10920 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
10930 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
10940 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10950 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
10960 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
10970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10980 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
10990 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
109a0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
109b0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
109c0 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
109d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
109e0 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
109f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
10a00 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
10a10 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
10a20 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
10a30 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
10a40 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
10a50 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10a60 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
10a70 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
10a80 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
10a90 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
10aa0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
10ab0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
10ac0 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
10ad0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
10ae0 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
10af0 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
10b00 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45   p. */.      WHE
10b10 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
10b20 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
10b30 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
10b40 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
10b70 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10b80 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
10b90 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut-1));.      pT
10ba0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
10bb0 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
10bc0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
10bd0 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
10be0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
10bf0 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
10c00 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
10c10 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
10c20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
10c30 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
10c40 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
10c50 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
10c60 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
10c70 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
10c80 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
10c90 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10ca0 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10cb0 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10cc0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10cd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10ce0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
10cf0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
10d00 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
10d10 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29  rRun, p->nOut+1)
10d20 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
10d30 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
10d40 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10d50 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10d60 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  Out + 1;.    }. 
10d70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72   }.}../*.** Sear
10d80 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  ch the list of W
10d90 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70  hereLoops in *pp
10da0 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  Prev looking for
10db0 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65   one that can be
10dc0 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62  .** supplanted b
10dd0 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  y pTemplate..**.
10de0 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
10df0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
10e00 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  list contains an
10e10 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20   entry that can 
10e20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d  supplant.** pTem
10e30 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20  plate, in other 
10e40 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
10e50 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
10e60 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ng on the list..
10e70 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61  **.** If pX is a
10e80 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
10e90 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75  pTemplate can su
10ea0 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74  pplant, then ret
10eb0 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20  urn the.** link 
10ec0 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  that points to p
10ed0 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d  X..**.** If pTem
10ee0 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70  plate cannot sup
10ef0 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69  plant any existi
10f00 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
10f10 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73  e list but needs
10f20 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20  .** to be added 
10f30 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65  to the list, the
10f40 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
10f50 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f  er to the tail o
10f60 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  f the list..*/.s
10f70 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20  tatic WhereLoop 
10f80 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  **whereLoopFindL
10f90 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f  esser(.  WhereLo
10fa0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63  op **ppPrev,.  c
10fb0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10fc0 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57  pTemplate.){.  W
10fd0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66  hereLoop *p;.  f
10fe0 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20  or(p=(*ppPrev); 
10ff0 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
11000 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
11010 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
11020 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
11030 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
11040 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
11050 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
11060 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
11070 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
11080 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
11090 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
110a0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
110b0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
110c0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
110d0 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
110e0 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
110f0 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
11100 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
11110 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
11120 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
11130 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
11140 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
11150 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
11160 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
11170 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
11180 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
11190 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
111a0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
111b0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
111c0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
111d0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
111e0 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
111f0 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
11200 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11210 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
11220 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11240 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
11250 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11260 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
11270 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
11280 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
11290 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
112a0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
112b0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
112c0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
112d0 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
112e0 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
112f0 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
11300 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
11310 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
11320 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
11330 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
11340 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
11350 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79  p );..    /* Any
11360 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61   loop using an a
11370 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65  ppliation-define
11380 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d  d index (or PRIM
11390 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a  ARY KEY or.    *
113a0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
113b0 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72  int) with one or
113c0 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61   more == constra
113d0 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20  ints is better. 
113e0 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75     ** than an au
113f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55  tomatic index. U
11400 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b  nless it is a sk
11410 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ip-scan. */.    
11420 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
11430 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
11440 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EX)!=0.     && (
11450 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70  pTemplate->nSkip
11460 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
11470 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11480 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11490 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
114a0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
114b0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
114c0 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EQ)!=0.     && (
114d0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
114e0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
114f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11500 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  q.    ){.      b
11510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11520 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20   /* If existing 
11530 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
11540 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
11550 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20  late, pTemplate 
11560 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69  can be.    ** di
11570 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c  scarded.  WhereL
11580 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
11590 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
115a0 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20    p has no more 
115b0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
115c0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64  n pTemplate, and
115d0 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
115e0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
115f0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11600 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a   pTemplate.    *
11610 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
11620 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
11630 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
11640 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20  ereq    /* (1)  
11650 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  */.     && p->rS
11660 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
11670 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20  >rSetup         
11680 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
11690 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
116a0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
116b0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
116c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
116d0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
116e0 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
116f0 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11710 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  c) */.    ){.   
11720 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
11730 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61   Discard pTempla
11740 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  te */.    }..   
11750 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65   /* If pTemplate
11760 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65   is always bette
11770 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63  r than p, then c
11780 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
11790 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20  rwritten.    ** 
117a0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20  with pTemplate. 
117b0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65   pTemplate is be
117c0 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a  tter than p if:.
117d0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54      **   (1)  pT
117e0 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d  emplate has no m
117f0 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20  ore dependences 
11800 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20  than p, and.    
11810 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c  **   (2)  pTempl
11820 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c  ate has an equal
11830 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11840 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  han p..    */.  
11850 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
11860 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
11870 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
11880 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31  ->prereq   /* (1
11890 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
118a0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
118b0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
118e0 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
118f0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11920 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  b) */.    ){.   
11930 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11940 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
11950 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
11960 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
11970 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ove */.      bre
11980 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70  ak;   /* Cause p
11990 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
119a0 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  en by pTemplate 
119b0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
119c0 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a  eturn ppPrev;.}.
119d0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
119e0 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
119f0 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
11a00 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
11a10 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
11a20 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11a30 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
11a40 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
11a50 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
11a60 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
11a70 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
11a80 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
11a90 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
11aa0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
11ab0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
11ac0 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
11ad0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
11ae0 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
11af0 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
11b00 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
11b10 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
11b20 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
11b30 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
11b40 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ded based on the
11b50 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a   template..**.**
11b60 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
11b70 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rSet is not NULL
11b80 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62   then we care ab
11b90 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
11ba0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
11bb0 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
11bc0 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
11bd0 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
11be0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
11bf0 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
11c00 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
11c10 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
11c20 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
11c30 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
11c40 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
11c50 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
11c60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
11c70 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
11c80 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
11c90 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11ca0 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
11cb0 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
11cc0 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
11cd0 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
11ce0 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
11cf0 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74  e.** new templat
11d00 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
11d10 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
11d20 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
11d30 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
11d40 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
11d50 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
11d60 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11d70 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
11d80 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
11d90 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
11da0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
11db0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
11dc0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
11dd0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
11de0 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
11df0 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
11e00 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
11e10 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11e20 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
11e30 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69  loop.*/.static i
11e40 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
11e50 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
11e60 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
11e70 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
11e80 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
11e90 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a  p **ppPrev, *p;.
11ea0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
11eb0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
11ec0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
11ed0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
11ee0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
11ef0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  t rc;..  /* If p
11f00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11f10 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
11f20 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
11f30 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
11f40 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
11f50 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
11f60 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
11f70 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c  {.    if( pTempl
11f80 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23  ate->nLTerm ){.#
11f90 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11fa0 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20  ABLED.      u16 
11fb0 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  n = pBuilder->pO
11fc0 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69  rSet->n;.      i
11fd0 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20  nt x =.#endif.  
11fe0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
11ff0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
12000 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
12010 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
12020 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
12050 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
12060 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12070 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
12080 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12090 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
120a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
120b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
120c0 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
120d0 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
120e0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
120f0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
12100 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
12110 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
12120 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  f.    }.    retu
12130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12140 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  }..  /* Look for
12150 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
12160 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63  reLoop to replac
12170 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  e with pTemplate
12180 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f  .  */.  whereLoo
12190 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e  pAdjustCost(pWIn
121a0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
121b0 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76  plate);.  ppPrev
121c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
121d0 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e  Lesser(&pWInfo->
121e0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
121f0 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65  e);..  if( ppPre
12200 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  v==0 ){.    /* T
12210 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
12220 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  sts a WhereLoop 
12230 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  on the list that
12240 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
12250 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  * than pTemplate
12260 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65  , so just ignore
12270 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69   pTemplate */.#i
12280 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12290 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
122a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
122b0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
122c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
122d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73  ebugPrintf("   s
122e0 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  kip: ");.      w
122f0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12300 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12310 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23  r->pWC);.    }.#
12320 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
12330 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20   SQLITE_OK;  .  
12340 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a  }else{.    p = *
12350 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f  ppPrev;.  }..  /
12360 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
12370 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
12380 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
12390 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
123a0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
123b0 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
123c0 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
123d0 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
123e0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
123f0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
12400 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
12410 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
12420 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
12430 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
12440 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
12450 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
12460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12470 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65  3DebugPrintf("re
12480 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20  place: ");.     
12490 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
124a0 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  p, pBuilder->pWC
124b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
124c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
124d0 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20  "    add: ");.  
124e0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
124f0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12500 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
12510 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
12520 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
12530 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
12540 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
12550 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
12560 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
12570 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
12580 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
12590 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
125a0 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
125b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
125c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
125d0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
125e0 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  p);.    p->pNext
125f0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Loop = 0;.  }els
12600 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c  e{.    /* We wil
12610 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67  l be overwriting
12620 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20   WhereLoop p[]. 
12630 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64   But before we d
12640 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  o, first.    ** 
12650 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  go through the r
12660 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  est of the list 
12670 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f  and delete any o
12680 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73  ther entries bes
12690 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20  ides.    ** p[] 
126a0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75  that are also su
126b0 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70  pplated by pTemp
126c0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72  late */.    Wher
126d0 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d  eLoop **ppTail =
126e0 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a   &p->pNextLoop;.
126f0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
12700 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65  ToDel;.    while
12710 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20  ( *ppTail ){.   
12720 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72     ppTail = wher
12730 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12740 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74  ppTail, pTemplat
12750 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70  e);.      if( pp
12760 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tail==0 ) break;
12770 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
12780 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
12790 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
127a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
127b0 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
127c0 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
127d0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
127e0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
127f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
12800 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
12810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
12820 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65  bugPrintf(" dele
12830 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  te: ");.        
12840 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12850 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
12860 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
12870 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
12880 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
12890 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
128a0 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c   }.  rc = whereL
128b0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
128c0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
128d0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
128e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
128f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
12900 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
12910 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
12920 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12930 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
12940 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
12950 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
12960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12980 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
12990 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
129a0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
129b0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
129c0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
129d0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
129e0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
129f0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
12a00 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
12a10 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65  ndex..*.** For e
12a20 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12a30 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12a40 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12a50 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12a60 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72  h has a truth pr
12a70 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e  obability assign
12a80 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
12a90 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a   likelihood(),.*
12aa0 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75  * likely(), or u
12ab0 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75  nlikely() SQL fu
12ac0 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20  nctions, reduce 
12ad0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
12ae0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75  mber.** of outpu
12af0 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72  t rows by the pr
12b00 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66  obability specif
12b10 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e  ied..**.** TUNIN
12b20 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48  G:  For every WH
12b30 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12b40 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
12b50 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
12b60 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20   and which does 
12b70 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69  not have an assi
12b80 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61  gned truth proba
12b90 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69  bility, heuristi
12ba0 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  cs.** described 
12bb0 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74  below are used t
12bc0 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
12bd0 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12be0 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f  ability..** TODO
12bf0 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69   --> Perhaps thi
12c00 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
12c10 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  hat could be imp
12c20 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a  roved by better.
12c30 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74  ** table statist
12c40 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  ics..**.** Heuri
12c50 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74  stic 1:  Estimat
12c60 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12c70 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35  ability as 93.75
12c80 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a  %.  The 93.75%.*
12c90 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f  * value correspo
12ca0 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67  nds to -1 in Log
12cb0 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f  Est notation, so
12cc0 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72   this means decr
12cd0 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65  ement.** the Whe
12ce0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c  reLoop.nOut fiel
12cf0 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68  d for every such
12d00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12d10 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  rm..**.** Heuris
12d20 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65  tic 2:  If there
12d30 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
12d40 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
12d50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12d60 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20   form "x==EXPR" 
12d70 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20  and EXPR is not 
12d80 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20  a constant 0 or 
12d90 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  1, then make sur
12da0 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f  e the.** final o
12db0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
12dc0 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72  te is no greater
12dd0 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65   than 1/4 of the
12de0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a   total number.**
12df0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
12e00 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
12e10 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74   words, assume t
12e20 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c  hat x==EXPR will
12e30 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61   filter.** out a
12e40 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66  t least 3 out of
12e50 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50   4 rows.  If EXP
12e60 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20  R is -1 or 0 or 
12e70 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68  1, then maybe th
12e80 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20  e.** "x" column 
12e90 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c  is boolean or el
12ea0 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20  se -1 or 0 or 1 
12eb0 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61  is a common defa
12ec0 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20  ult value.** on 
12ed0 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61  the "x" column a
12ee0 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  nd so in that ca
12ef0 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20  se only cap the 
12f00 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
12f10 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e  ate.** at 1/2 in
12f20 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f  stead of 1/4..*/
12f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
12f40 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
12f50 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  st(.  WhereClaus
12f60 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
12f70 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
12f80 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
12f90 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20  *pLoop,      /* 
12fa0 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75  The loop to adju
12fb0 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20  st downward */. 
12fc0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20   LogEst nRow    
12fd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12fe0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
12ff0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
13000 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
13010 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
13020 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
13030 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
13040 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
13050 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
13060 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52  , k;.  LogEst iR
13070 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a  educe = 0;    /*
13080 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f   pLoop->nOut sho
13090 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e  uld not exceed n
130a0 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a  Row-iReduce */..
130b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
130c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
130d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
130e0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   );.  for(i=pWC-
130f0 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
13100 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
13110 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
13120 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
13130 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
13140 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
13150 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13160 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
13170 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
13180 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13190 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
131a0 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
131b0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
131c0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
131d0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
131e0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
131f0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
13200 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
13210 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
13220 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
13230 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13240 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
13250 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
13260 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
13270 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
13280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
13290 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
132a0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
132b0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
132c0 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f  * If a truth pro
132d0 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63  bability is spec
132e0 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  ified using the 
132f0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e  likelihood() hin
13300 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts,.        ** t
13310 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62  hen use the prob
13320 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64  ability provided
13330 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
13340 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
13350 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
13360 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
13370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13380 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
13390 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69  absence of expli
133a0 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62  cit truth probab
133b0 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75  ilities, use heu
133c0 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20  ristics to.     
133d0 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65     ** guess a re
133e0 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70  asonable truth p
133f0 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20  robability. */. 
13400 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
13410 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  ut--;.        if
13420 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13430 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
13440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
13450 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
13460 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13470 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
13480 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
13490 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
134a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
134b0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
134c0 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29  eger(pRight, &k)
134d0 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b   && k>=(-1) && k
134e0 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=1 ){.         
134f0 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20     k = 10;.     
13500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13510 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a          k = 20;.
13520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13530 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63        if( iReduc
13540 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20  e<k ) iReduce = 
13550 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13570 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
13580 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20   > nRow-iReduce 
13590 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  )  pLoop->nOut =
135a0 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b   nRow - iReduce;
135b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
135c0 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74   the cost C by t
135d0 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74  he costMult fact
135e0 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79  er T.  This only
135f0 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f   occurs if.** co
13600 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51  mpiled with -DSQ
13610 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
13620 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53  MULT.*/.#ifdef S
13630 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
13640 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41  TMULT.# define A
13650 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
13660 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a  er(C,T)  C += T.
13670 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
13680 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
13690 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a  er(C,T).#endif..
136a0 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
136b0 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
136c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
136d0 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
136e0 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20  f the .** index 
136f0 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d  pIndex. Try to m
13700 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
13710 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
13720 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13730 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  d, pBuilder->pNe
13740 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73  w->nOut contains
13750 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
13760 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64  of rows expected
13770 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62   to be visited b
13780 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e  y filtering usin
13790 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65  g the nEq .** te
137a0 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20  rms only. If it 
137b0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69  is modified, thi
137c0 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f  s value is resto
137d0 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  red before this 
137e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
137f0 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  urns..**.** If p
13800 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
13810 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
13820 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
13830 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
13840 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
13850 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
13860 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
13870 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
13880 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
13890 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
138a0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
138b0 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
138c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
138d0 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
138e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
138f0 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
13900 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
13910 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
13920 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
13930 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f   on pSrc */.  Lo
13940 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  gEst nInMul     
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13960 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
13970 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
13980 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
13990 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
139a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
139b0 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
139c0 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
139d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
139e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
139f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
13a00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13a10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13a20 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
13a30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13a40 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
13a50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
13a60 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
13a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13a80 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
13a90 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
13aa0 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
13ab0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
13ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
13ad0 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
13ae0 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
13af0 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
13b20 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
13b30 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
13b40 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
13b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
13b60 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
13b70 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
13b80 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
13b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
13ba0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
13bb0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
13bc0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
13bd0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
13be0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13bf0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
13c00 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  erm */.  u16 sav
13c10 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
13c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
13c30 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
13c40 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
13c50 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
13c60 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
13c70 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
13c80 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
13c90 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
13ca0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
13cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
13cc0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
13cd0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
13ce0 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
13cf0 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
13d00 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
13d10 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
13d20 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ut */.  int rc =
13d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13d40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
13d50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45  n code */.  LogE
13d60 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
13d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13d80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
13d90 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
13da0 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
13dd0 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
13de0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
13df0 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
13e00 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
13e10 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
13e20 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
13e30 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
13e40 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13e50 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
13e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13e70 50 54 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  PT;..  assert( (
13e80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
13e90 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
13ea0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
13eb0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13ec0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
13ed0 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
13ee0 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
13ef0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
13f00 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
13f10 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
13f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
13f30 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
13f40 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
13f50 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55  LT|WO_LE|WO_ISNU
13f60 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20  LL|WO_IS;.  }.  
13f70 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
13f80 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
13f90 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
13fa0 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
13fb0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
13fc0 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
13fd0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a  be->nColumn );..
13fe0 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
13ff0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14000 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d  .  saved_nSkip =
14010 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20   pNew->nSkip;.  
14020 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
14030 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
14040 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
14050 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
14060 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
14070 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
14080 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
14090 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20  ->nOut;.  pTerm 
140a0 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
140b0 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
140c0 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
140d0 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a  sor, saved_nEq,.
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140f0 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20          opMask, 
14100 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d  pProbe);.  pNew-
14110 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72  >rSetup = 0;.  r
14120 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
14130 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
14140 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
14150 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72  og(rSize);.  for
14160 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
14170 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
14180 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
14190 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
141a0 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d   u16 eOp = pTerm
141b0 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f  ->eOperator;   /
141c0 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
141d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
141e0 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72   */.    LogEst r
141f0 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67  CostIdx;.    Log
14200 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  Est nOutUnadjust
14210 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f  ed;        /* nO
14220 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61  ut before IN() a
14230 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d  nd WHERE adjustm
14240 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
14250 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  nIn = 0;.#ifdef 
14260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14270 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
14280 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
14290 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
142a0 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20  alid;.#endif.   
142b0 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53   if( (eOp==WO_IS
142c0 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
142d0 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
142e0 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
142f0 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
14300 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64  ll(pProbe, saved
14310 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  _nEq).    ){.   
14320 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
14330 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
14340 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
14350 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
14360 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
14370 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
14380 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
14390 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
143a0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
143b0 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75   not allow the u
143c0 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20  pper bound of a 
143d0 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
143e0 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
143f0 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78  nt.    ** to mix
14400 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61   with a lower ra
14410 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73  nge bound from s
14420 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65  ome other source
14430 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
14440 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14450 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65  M_LIKEOPT && pTe
14460 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
14470 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_LT ) continue;
14480 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
14490 61 6c 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61  allow IS constra
144a0 69 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48  ints from the WH
144b0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
144c0 20 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20   used by the.   
144d0 20 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20   ** right table 
144e0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
144f0 20 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74   Only constraint
14500 73 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  s in the ON clau
14510 73 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c  se are.    ** al
14520 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  lowed */.    if(
14530 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74   (pSrc->fg.joint
14540 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
14550 30 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48  0.     && !ExprH
14560 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
14570 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
14580 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65  Join).     && (e
14590 4f 70 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49  Op & (WO_IS|WO_I
145a0 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29  SNULL))!=0.    )
145b0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
145c0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b  ( eOp & WO_IS );
145d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
145e0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
145f0 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   );.      contin
14600 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ue;.    }..    p
14610 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
14620 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
14630 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
14640 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
14650 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
14660 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
14670 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
14680 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
14690 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
146a0 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
146b0 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  OOM */.    pNew-
146c0 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
146d0 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  Term++] = pTerm;
146e0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
146f0 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65  q = (saved_prere
14700 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
14710 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d  qRight) & ~pNew-
14720 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20  >maskSelf;..    
14730 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d  assert( nInMul==
14740 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e  0.        || (pN
14750 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
14760 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
14770 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  !=0 .        || 
14780 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
14790 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
147a0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
147b0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
147c0 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
147d0 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20  )!=0 .    );..  
147e0 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
147f0 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
14800 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
14810 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
14820 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
14830 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
14840 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
14850 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14860 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
14870 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
14880 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
14890 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
148a0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
148b0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
148c0 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
148d0 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
148e0 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  gEst(25) );.    
148f0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
14900 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
14910 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
14920 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
14930 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
14940 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
14950 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
14960 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  nIn = sqlite3Log
14970 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Est(pExpr->x.pLi
14980 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
14990 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
149a0 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
149b0 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
149c0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
149d0 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
14a00 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
14a10 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d  "x=?". */..    }
14a20 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
14a30 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
14a40 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
14a50 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
14a60 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20  n[saved_nEq];.  
14a70 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14a80 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
14a90 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65  N_EQ;.      asse
14aa0 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70  rt( saved_nEq==p
14ab0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14ac0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
14ad0 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20  ol==XN_ROWID .  
14ae0 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 30 20       || (iCol>0 
14af0 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20  && nInMul==0 && 
14b00 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62  saved_nEq==pProb
14b10 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20  e->nKeyCol-1).  
14b20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
14b30 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50  f( iCol>=0 && pP
14b40 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  robe->uniqNotNul
14b50 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
14b60 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
14b70 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  |= WHERE_UNQ_WAN
14b80 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  TED;.        }el
14b90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
14ba0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14bb0 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
14bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
14be0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
14bf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14c00 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
14c10 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65  UMN_NULL;.    }e
14c20 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
14c30 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
14c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14c50 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20  Op & WO_GT );.  
14c60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14c70 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  p & WO_GE );.   
14c80 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
14c90 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
14ca0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
14cb0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42  _LIMIT;.      pB
14cc0 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
14cd0 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
14ce0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
14cf0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
14d00 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OPT ){.        /
14d10 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  * Range contrain
14d20 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ts that come fro
14d30 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  m the LIKE optim
14d40 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ization are.    
14d50 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73      ** always us
14d60 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a  ed in pairs. */.
14d70 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26          pTop = &
14d80 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  pTerm[1];.      
14d90 20 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d    assert( (pTop-
14da0 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29  (pTerm->pWC->a))
14db0 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65  <pTerm->pWC->nTe
14dc0 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rm );.        as
14dd0 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c  sert( pTop->wtFl
14de0 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
14df0 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  PT );.        as
14e00 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65  sert( pTop->eOpe
14e10 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a  rator==WO_LT );.
14e20 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
14e30 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
14e40 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
14e50 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
14e60 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20  * OOM */.       
14e70 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
14e80 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
14e90 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e  pTop;.        pN
14ea0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14eb0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
14ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14ed0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
14ee0 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
14ef0 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
14f00 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14f10 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
14f20 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14f30 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
14f40 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14f50 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
14f60 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
14f70 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
14f80 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
14f90 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
14fa0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
14fb0 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
14fd0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
14fe0 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
14ff0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
15000 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77   this point pNew
15010 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ->nOut is set to
15020 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
15030 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ows expected to.
15040 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65      ** be visite
15050 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73  d by the index s
15060 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69  can before consi
15070 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72  dering term pTer
15080 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  m, or the.    **
15090 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61   values of nIn a
150a0 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74  nd nInMul. In ot
150b0 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
150c0 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20  ing that all .  
150d0 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22    ** "x IN(...)"
150e0 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61   terms are repla
150f0 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22  ced with "x = ?"
15100 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64  . This block upd
15110 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ates.    ** the 
15120 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
15130 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Out to account f
15140 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f  or pTerm (but no
15150 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20  t nIn/nInMul).  
15160 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
15170 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
15180 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28  _nOut );.    if(
15190 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
151a0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
151b0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
151c0 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e  Adjust nOut usin
151d0 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61  g stat3/stat4 da
151e0 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  ta. Or, if there
151f0 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61   is no stat3/sta
15200 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  t4.      ** data
15210 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68  , using some oth
15220 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f  er estimate.  */
15230 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
15240 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
15250 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c   pBuilder, pBtm,
15260 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20   pTop, pNew);.  
15270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
15280 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d  nt nEq = ++pNew-
15290 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
152a0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
152b0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
152c0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20  EQ|WO_IN|WO_IS) 
152d0 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
152e0 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
152f0 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
15300 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
15310 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70 50 72  thProb<=0 && pPr
15320 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61  obe->aiColumn[sa
15330 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20  ved_nEq]>=0 ){. 
15340 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
15350 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20  eOp & WO_IN) || 
15360 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nIn==0 );.      
15370 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
15380 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20  & WO_IN );.     
15390 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
153a0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
153b0 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  b;.        pNew-
153c0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
153d0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
153e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
153f0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
15400 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e         tRowcnt n
15410 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Out = 0;.       
15420 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a   if( nInMul==0 .
15430 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
15440 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  be->nSample .   
15450 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75        && pNew->u
15460 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
15470 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  be->nSampleCol. 
15480 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70          && ((eOp
15490 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20   & WO_IN)==0 || 
154a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
154b0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
154c0 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20  P_xIsSelect)).  
154d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
154e0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
154f0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
15500 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f           if( (eO
15510 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
15520 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20  NULL|WO_IS))!=0 
15530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
15540 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
15550 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
15560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
15570 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  p & WO_IS );.   
15580 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
15590 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  e( eOp & WO_ISNU
155a0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  LL );.          
155b0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
155c0 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
155d0 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
155e0 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29  ->pRight, &nOut)
155f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
15600 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
15610 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
15620 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
15630 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  der, pExpr->x.pL
15640 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
15650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15670 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
15680 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15690 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
156a0 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
156b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
156c0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54  mp out of the pT
156d0 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  erm loop */.    
156e0 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29        if( nOut )
156f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
15700 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
15710 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a  e3LogEst(nOut);.
15720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15730 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
15740 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
15750 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
15760 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
15770 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
15780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
157a0 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64  ( nOut==0 ).#end
157b0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
157c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
157d0 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69  t += (pProbe->ai
157e0 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d  RowLogEst[nEq] -
157f0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
15800 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20  gEst[nEq-1]);.  
15810 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20          if( eOp 
15820 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
15830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55             /* TU
15840 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
15850 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  s no likelihood(
15860 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20  ) value, assume 
15870 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20  that a .        
15880 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e      ** "col IS N
15890 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ULL" expression 
158a0 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73  matches twice as
158b0 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20   many rows .    
158c0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63          ** as (c
158d0 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ol=?). */.      
158e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
158f0 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   += 10;.        
15900 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
15920 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78   /* Set rCostIdx
15930 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
15940 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65  visiting selecte
15950 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e  d rows in index.
15960 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74   Add.    ** it t
15970 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68  o pNew->rRun, wh
15980 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ich is currently
15990 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74   set to the cost
159a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
159b0 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20    ** seek only. 
159c0 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73  Then, if this is
159d0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
159e0 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63  index, add the c
159f0 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69  ost of.    ** vi
15a00 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20  siting the rows 
15a10 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
15a20 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74  e.  */.    rCost
15a30 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Idx = pNew->nOut
15a40 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
15a50 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72  e->szIdxRow)/pSr
15a60 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  c->pTab->szTabRo
15a70 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  w;.    pNew->rRu
15a80 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
15a90 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72  tAdd(rLogSize, r
15aa0 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66  CostIdx);.    if
15ab0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15ac0 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
15ad0 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
15ae0 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 ){.      pNew-
15af0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
15b00 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
15b10 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  Run, pNew->nOut 
15b20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20  + 16);.    }.   
15b30 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
15b40 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
15b50 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
15b60 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20  >costMult);..   
15b70 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20   nOutUnadjusted 
15b80 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
15b90 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
15ba0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
15bb0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
15bc0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
15bd0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
15be0 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
15bf0 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  ->pWC, pNew, rSi
15c00 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ze);.    rc = wh
15c10 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
15c20 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a  uilder, pNew);..
15c30 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
15c40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
15c50 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
15c60 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15c70 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
15c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
15c90 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55  ew->nOut = nOutU
15ca0 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d  nadjusted;.    }
15cb0 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ..    if( (pNew-
15cc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15cd0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
15ce0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
15cf0 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
15d00 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
15d10 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
15d20 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
15d30 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
15d40 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
15d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
15d60 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15d70 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Out;.#ifdef SQLI
15d80 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
15d90 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75  OR_STAT4.    pBu
15da0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
15db0 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65   = nRecValid;.#e
15dc0 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  ndif.  }.  pNew-
15dd0 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
15de0 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
15df0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
15e00 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
15e10 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
15e20 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  Skip;.  pNew->ws
15e30 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15e40 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
15e50 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15e60 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
15e70 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
15e80 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
15e90 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
15ea0 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
15eb0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
15ec0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
15ed0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
15ee0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
15ef0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
15f00 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
15f10 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
15f20 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
15f30 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
15f40 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
15f50 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
15f60 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
15f70 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
15f80 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
15f90 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
15fa0 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
15fb0 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
15fc0 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
15fd0 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
15fe0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
15ff0 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
16000 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
16010 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
16020 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
16030 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
16040 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
16050 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
16060 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
16070 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
16080 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
16090 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
160a0 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
160b0 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
160c0 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
160d0 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
160e0 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
160f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
16100 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
16110 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
16120 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
16130 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
16140 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
16150 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20  noSkipScan==0.  
16160 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
16170 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
16180 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
16190 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
161a0 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
161b0 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
161c0 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
161d0 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
161e0 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
161f0 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
16200 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
16210 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
16220 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b      pNew->nSkip+
16230 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  +;.    pNew->aLT
16240 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
16250 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ++] = 0;.    pNe
16260 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
16270 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20  ERE_SKIPSCAN;.  
16280 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65    nIter = pProbe
16290 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
162a0 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62  ved_nEq] - pProb
162b0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
162c0 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20  aved_nEq+1];.   
162d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
162e0 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e  Iter;.    /* TUN
162f0 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e  ING:  Because un
16300 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74  certainties in t
16310 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  he estimates for
16320 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69   skip-scan queri
16330 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61  es,.    ** add a
16340 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63   1.375 fudge fac
16350 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70  tor to make skip
16360 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c  -scan slightly l
16370 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20  ess likely. */. 
16380 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20     nIter += 5;. 
16390 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
163a0 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
163b0 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
163c0 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
163d0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
163e0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
163f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
16400 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
16410 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  q;.    pNew->nSk
16420 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
16430 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
16440 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
16450 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ags;.  }..  retu
16460 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16470 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
16480 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
16490 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
164a0 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
164b0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
164c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
164d0 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
164e0 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
164f0 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
16500 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
16510 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16520 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
16530 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
16540 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
16550 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
16560 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
16570 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
16580 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
16590 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
165a0 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
165b0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
165c0 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
165d0 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
165e0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
165f0 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  pOB;.  ExprList 
16600 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74  *aColExpr;.  int
16610 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
16620 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
16630 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
16640 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
16650 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
16660 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
16670 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
16680 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
16690 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
166a0 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
166b0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
166c0 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
166d0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
166e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
166f0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
16700 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le==iCursor ){. 
16710 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
16720 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
16730 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  rn 1;.      for(
16740 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
16750 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
16760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
16770 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
16780 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
16790 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
167a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
167b0 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20  if( (aColExpr = 
167c0 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
167d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
167e0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
167f0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
16800 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
16810 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
16820 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63  jj]!=XN_EXPR ) c
16830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
16840 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16850 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 61 43  Compare(pExpr,aC
16860 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45  olExpr->a[jj].pE
16870 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20  xpr,iCursor)==0 
16880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16890 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
168a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
168b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
168c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
168d0 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
168e0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
168f0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16900 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
16910 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
16920 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
16930 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
16940 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
16950 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
16960 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
16970 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
16980 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
16990 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
169a0 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
169b0 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
169c0 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
169d0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
169e0 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
169f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
16a00 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
16a10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16a20 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
16a30 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
16a40 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
16a50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
16a60 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
16a70 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
16a80 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
16a90 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
16aa0 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
16ab0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
16ac0 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
16ad0 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
16ae0 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
16af0 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
16b00 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
16b10 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
16b20 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
16b30 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
16b40 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
16b50 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
16b60 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65  m;.  while( pWhe
16b70 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
16b80 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65  {.    if( !where
16b90 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
16ba0 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65  ex(iTab,pWC,pWhe
16bb0 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  re->pLeft) ) ret
16bc0 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72  urn 0;.    pWher
16bd0 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67  e = pWhere->pRig
16be0 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ht;.  }.  for(i=
16bf0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
16c00 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
16c10 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
16c20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
16c30 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
16c40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
16c50 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 78  rImpliesExpr(pEx
16c60 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
16c70 29 20 0a 20 20 20 20 20 26 26 20 28 21 45 78 70  ) .     && (!Exp
16c80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16c90 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
16ca0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
16cb0 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62  tJoinTable==iTab
16cc0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
16cd0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
16ce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16cf0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
16d00 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
16d10 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
16d20 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
16d30 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
16d40 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
16d50 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
16d60 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
16d70 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
16d80 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
16d90 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
16da0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
16db0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
16dc0 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
16dd0 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
16de0 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
16df0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
16e00 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
16e10 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
16e20 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
16e30 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
16e40 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
16e50 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
16e60 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
16e70 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
16ea0 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
16eb0 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ed0 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
16ee0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
16ef0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
16f00 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
16f10 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
16f20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
16f30 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
16f40 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
16f50 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
16f60 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
16f70 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
16f80 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
16f90 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
16fa0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
16fb0 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
16fc0 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
16fd0 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
16fe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
16ff0 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
17000 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
17010 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
17020 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
17030 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
17040 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
17050 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
17060 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
17070 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
17080 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
17090 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
170a0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
170b0 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
170c0 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
170d0 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
170e0 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
170f0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
17100 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
17110 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
17120 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
17130 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
17140 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
17150 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
17160 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
17170 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
17180 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
17190 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
171a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
171b0 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
171c0 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
171d0 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ip-scans..**.** 
171e0 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61  The estimated va
171f0 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73  lues (nRow, nVis
17200 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e  it, nSeek) often
17210 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65   contain a large
17220 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e   amount.** of un
17230 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20  certainty.  For 
17240 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f  this reason, sco
17250 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64  ring is designed
17260 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74   to pick plans t
17270 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c  hat.** "do the l
17280 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68  east harm" if th
17290 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20  e estimates are 
172a0 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72  inaccurate.  For
172b0 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c   example, a.** l
172c0 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20  og(nRow) factor 
172d0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
172e0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
172f0 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64  ndex scan in ord
17300 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68  er to.** bias th
17310 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76  e scoring in fav
17320 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  or of using an i
17330 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20  ndex, since the 
17340 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65  worst-case.** pe
17350 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69  rformance of usi
17360 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66  ng an index is f
17370 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  ar better than t
17380 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65  he worst-case pe
17390 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20  rformance.** of 
173a0 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
173b0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
173c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
173d0 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
173e0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
173f0 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
17400 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
17410 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
17420 65 71 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  eq             /
17430 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
17440 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
17450 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
17460 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
17470 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
17480 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
17490 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
174a0 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
174b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
174c0 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
174d0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
174e0 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
174f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
17500 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
17510 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
17520 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  key */.  LogEst 
17530 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
17540 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
17550 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20  wLogEst[] value 
17560 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
17570 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c  x */.  i16 aiCol
17580 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
17590 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
175a0 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
175b0 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
175c0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
175d0 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
175e0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
175f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
17600 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
17610 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
17620 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
17630 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
17640 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
17650 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
17660 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
17670 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
17680 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
17690 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
176a0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
176b0 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
176c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
176d0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
17700 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f  an value */.  Lo
17710 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
17720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
17730 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
17740 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
17750 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
17760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
17770 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
17780 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
17790 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
177a0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
177b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
177c0 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
177d0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  lause */.  Table
177e0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
177f0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
17800 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
17810 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
17820 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
17830 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
17840 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
17850 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
17860 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
17870 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
17880 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54  pNew->iTab;.  pT
17890 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
178a0 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
178b0 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74  r->pWC;.  assert
178c0 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72  ( !IsVirtual(pSr
178d0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69  c->pTab) );..  i
178e0 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  f( pSrc->pIBInde
178f0 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
17900 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
17910 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
17920 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
17930 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
17940 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e  be = pSrc->pIBIn
17950 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
17960 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
17970 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
17980 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
17990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
179a0 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
179b0 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
179c0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
179d0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
179e0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
179f0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
17a00 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
17a10 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
17a20 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
17a30 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
17a40 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
17a50 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
17a60 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
17a70 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
17a80 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
17a90 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
17aa0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
17ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
17ac0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
17ad0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
17ae0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
17af0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
17b00 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
17b10 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
17b20 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
17b30 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
17b40 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
17b50 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
17b60 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
17b70 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
17b80 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
17b90 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
17ba0 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
17bb0 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
17bc0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69  szTabRow;.    ai
17bd0 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
17be0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
17bf0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
17c00 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73  ] = 0;.    pFirs
17c10 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
17c20 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
17c30 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  pSrc->fg.notInde
17c40 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
17c50 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
17c60 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
17c70 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
17c80 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
17c90 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
17ca0 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
17cb0 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
17cc0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
17cd0 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
17ce0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
17cf0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
17d00 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
17d10 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
17d20 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
17d30 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
17d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17d50 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
17d60 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
17d70 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
17d80 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
17d90 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  Set      /* Not 
17da0 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70  part of an OR op
17db0 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  timization */.  
17dc0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
17dd0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
17de0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
17df0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
17e00 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
17e10 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
17e20 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70  ndex)!=0.   && p
17e30 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30  Src->pIBIndex==0
17e40 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
17e50 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
17e60 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  e */.   && !pSrc
17e70 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20  ->fg.notIndexed 
17e80 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20    /* Has no NOT 
17e90 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a  INDEXED clause *
17ea0 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64  /.   && HasRowid
17eb0 28 70 54 61 62 29 20 20 20 20 20 20 20 20 20 2f  (pTab)         /
17ec0 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f  * Not WITHOUT RO
17ed0 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d  WID table. (FIXM
17ee0 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a  E: Why not?) */.
17ef0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
17f00 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20  isCorrelated /* 
17f10 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
17f20 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
17f30 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52  && !pSrc->fg.isR
17f40 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74  ecursive  /* Not
17f50 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d   a recursive com
17f60 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
17f70 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20  sion. */.  ){.  
17f80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75    /* Generate au
17f90 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f  to-index WhereLo
17fa0 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ops */.    Where
17fb0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
17fc0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
17fd0 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
17fe0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
17ff0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
18000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18010 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
18020 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
18030 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
18040 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
18050 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
18060 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
18070 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
18080 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
18090 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
180a0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
180b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
180c0 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Skip = 0;.      
180d0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
180e0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
180f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
18100 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
18110 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
18120 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f  pTerm;.        /
18130 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69  * TUNING: One-ti
18140 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70  me cost for comp
18150 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61  uting the automa
18160 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20  tic index is.   
18170 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65       ** estimate
18180 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32  d to be X*N*log2
18190 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
181a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
181b0 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s in.        ** 
181c0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
181d0 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65 72  indexed and wher
181e0 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74  e X is 7 (LogEst
181f0 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a  =28) for normal.
18200 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18210 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45  s or 1.375 (LogE
18220 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20  st=4) for views 
18230 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e 20  and subqueries. 
18240 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   The value.     
18250 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d     ** of X is sm
18260 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20  aller for views 
18270 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 73  and subqueries s
18280 6f 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79  o that the query
18290 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20   planner.       
182a0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65   ** will be more
182b0 20 61 67 67 72 65 73 73 69 76 65 20 61 62 6f 75   aggressive abou
182c0 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74  t generating aut
182d0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 66  omatic indexes f
182e0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  or.        ** th
182f0 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e  ose objects, sin
18300 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  ce there is no o
18310 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64  pportunity to ad
18320 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20  d schema.       
18330 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73   ** indexes on s
18340 75 62 71 75 65 72 69 65 73 20 61 6e 64 20 76 69  ubqueries and vi
18350 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ews. */.        
18360 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
18370 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
18380 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + 4;.        if(
18390 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
183a0 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  0 && (pTab->tabF
183b0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
183c0 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ral)==0 ){.     
183d0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
183e0 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20  p += 24;.       
183f0 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
18400 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
18410 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61  New->rSetup, pTa
18420 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
18430 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
18440 72 53 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d  rSetup<0 ) pNew-
18450 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
18460 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
18470 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  Each index looku
18480 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73  p yields 20 rows
18490 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
184a0 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  This.        ** 
184b0 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  is more than the
184c0 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20   usual guess of 
184d0 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77  10 rows, since w
184e0 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20  e have no way.  
184f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77        ** of know
18500 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
18510 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
18520 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
18530 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
18540 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
18550 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
18560 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
18570 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
18580 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
18590 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
185a0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
185b0 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  20) );.        p
185c0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
185d0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
185e0 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
185f0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
18600 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
18610 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
18620 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
18630 71 20 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54  q = mPrereq | pT
18640 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
18650 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
18660 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
18670 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
18680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18690 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
186a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
186b0 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a  C_INDEX */..  /*
186c0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
186d0 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f  ndices.  */.  fo
186e0 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
186f0 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72  K && pProbe; pPr
18700 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
18710 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a  t, iSortIdx++){.
18720 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
18730 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
18740 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55  .     && !whereU
18750 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
18760 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  x(pSrc->iCursor,
18770 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50   pWC, pProbe->pP
18780 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a  artIdxWhere) ){.
18790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
187a0 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63  pNew->iTab!=pSrc
187b0 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a  ->iCursor );  /*
187c0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64   See ticket [98d
187d0 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20  973b8f5] */.    
187e0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
187f0 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
18800 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
18810 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
18820 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20    }.    rSize = 
18830 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
18840 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77  Est[0];.    pNew
18850 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
18860 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  0;.    pNew->nSk
18870 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  ip = 0;.    pNew
18880 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
18890 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
188a0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
188b0 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
188c0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
188d0 50 72 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77  Prereq;.    pNew
188e0 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
188f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
18900 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62  e.pIndex = pProb
18910 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78  e;.    b = index
18920 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64  MightHelpWithOrd
18930 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70  erBy(pBuilder, p
18940 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75  Probe, pSrc->iCu
18950 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68  rsor);.    /* Th
18960 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  e ONEPASS_DESIRE
18970 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63  D flags never oc
18980 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69  curs together wi
18990 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  th ORDER BY */. 
189a0 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e     assert( (pWIn
189b0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
189c0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
189d0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d  ESIRED)==0 || b=
189e0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
189f0 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b  robe->tnum<=0 ){
18a00 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65  .      /* Intege
18a10 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  r primary key in
18a20 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  dex */.      pNe
18a30 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
18a40 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f  RE_IPK;..      /
18a50 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * Full table sca
18a60 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  n */.      pNew-
18a70 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
18a80 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20  iSortIdx : 0;.  
18a90 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
18aa0 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c  ost of full tabl
18ab0 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30  e scan is (N*3.0
18ac0 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ). */.      pNew
18ad0 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
18ae0 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79   16;.      Apply
18af0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
18b00 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
18b10 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
18b20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
18b30 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
18b40 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
18b50 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
18b60 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
18b70 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
18b80 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
18b90 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
18ba0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
18bb0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
18bc0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  m;.      if( pPr
18bd0 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  obe->isCovering 
18be0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
18bf0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
18c00 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
18c10 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20  E_INDEXED;.     
18c20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20     m = 0;.      
18c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
18c40 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
18c50 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
18c60 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
18c70 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
18c80 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48  s = (m==0) ? (WH
18c90 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
18ca0 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48  RE_INDEXED) : WH
18cb0 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
18cc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
18cd0 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64  ull scan via ind
18ce0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
18cf0 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73  b.       || !Has
18d00 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20  Rowid(pTab).    
18d10 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50     || pProbe->pP
18d20 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
18d30 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a        || ( m==0.
18d40 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
18d50 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
18d60 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
18d70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c  Probe->szIdxRow<
18d80 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a  pTab->szTabRow).
18d90 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
18da0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
18db0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
18dc0 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20  DESIRED)==0.    
18dd0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47       && sqlite3G
18de0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
18df0 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cis.         && 
18e00 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
18e10 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  led(pWInfo->pPar
18e20 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
18e30 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20  overIdxScan).   
18e40 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29         ).      )
18e50 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
18e60 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
18e70 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20  SortIdx : 0;..  
18e80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
18e90 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68  t of visiting th
18ea0 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20  e index rows is 
18eb0 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a  N*K, where K is.
18ec0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
18ed0 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20  en 1.1 and 3.0, 
18ee0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
18ef0 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20   relative sizes 
18f00 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
18f10 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  * index and tabl
18f20 65 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20  e rows. If this 
18f30 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  is a non-coverin
18f40 67 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20  g index scan,.  
18f50 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64        ** also ad
18f60 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69  d the cost of vi
18f70 73 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77  siting table row
18f80 73 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20  s (N*3.0).  */. 
18f90 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
18fa0 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20  n = rSize + 1 + 
18fb0 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64  (15*pProbe->szId
18fc0 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61  xRow)/pTab->szTa
18fd0 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  bRow;.        if
18fe0 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m!=0 ){.      
18ff0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
19000 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
19010 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53  d(pNew->rRun, rS
19020 69 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20  ize+16);.       
19030 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
19040 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
19050 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d  New->rRun, pTab-
19060 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
19070 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
19080 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
19090 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
190a0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
190b0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
190c0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
190d0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
190e0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
190f0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
19100 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
19110 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
19120 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
19130 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
19140 72 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66  robe, 0);.#ifdef
19150 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
19160 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
19170 20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72    sqlite3Stat4Pr
19180 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72  obeFree(pBuilder
19190 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75  ->pRec);.    pBu
191a0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
191b0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64   = 0;.    pBuild
191c0 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65  er->pRec = 0;.#e
191d0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
191e0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
191f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
19200 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
19210 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
19220 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
19230 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
19240 70 49 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b  pIBIndex ) break
19250 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19260 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
19270 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
19280 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72  LTABLE../*.** Ar
19290 67 75 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20  gument pIdxInfo 
192a0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
192b0 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f  ated with all co
192c0 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d  nstraints that m
192d0 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79  ay.** be used by
192e0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
192f0 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
19300 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
19310 3e 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66  >iTab. This.** f
19320 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20  unction marks a 
19330 73 75 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20  subset of those 
19340 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62  constraints usab
19350 6c 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  le, invokes the.
19360 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  ** xBestIndex me
19370 74 68 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68  thod and adds th
19380 65 20 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20  e returned plan 
19390 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  to pBuilder..**.
193a0 2a 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20  ** A constraint 
193b0 69 73 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65  is marked usable
193c0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41   if:.**.**   * A
193d0 72 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20  rgument mUsable 
193e0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69  indicates that i
193f0 74 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ts prerequisites
19400 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20   are available, 
19410 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74  and.**.**   * It
19420 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74   is not one of t
19430 68 65 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65  he operators spe
19440 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45  cified in the mE
19450 78 63 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73  xclude mask pass
19460 65 64 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65  ed.**     as the
19470 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
19480 20 28 77 68 69 63 68 20 69 6e 20 70 72 61 63 74   (which in pract
19490 69 63 65 20 69 73 20 65 69 74 68 65 72 20 57 4f  ice is either WO
194a0 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a  _IN or 0)..**.**
194b0 20 41 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65   Argument mPrere
194c0 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74  q is a mask of t
194d0 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
194e0 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
194f0 65 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  e the.** virtual
19500 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
19510 6f 6e 2e 20 54 68 65 73 65 20 61 72 65 20 61 64  on. These are ad
19520 64 65 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73  ded to the plans
19530 20 70 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a   prerequisites.*
19540 2a 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 61  * before it is a
19550 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
19560 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70  ..**.** Output p
19570 61 72 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69  arameter *pbIn i
19580 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
19590 20 74 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20   the plan added 
195a0 74 6f 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75  to pBuilder.** u
195b0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
195c0 57 4f 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20  WO_IN terms, or 
195d0 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
195e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
195f0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
19600 61 6c 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f  alOne(.  WhereLo
19610 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
19620 64 65 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d  der,.  Bitmask m
19630 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20  Prereq,         
19640 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
19650 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75  f tables that mu
19660 73 74 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20  st be used. */. 
19670 20 42 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65   Bitmask mUsable
19680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19690 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62   /* Mask of usab
196a0 6c 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75  le tables */.  u
196b0 31 36 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20  16 mExclude,    
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
196d0 2a 20 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20  * Exclude terms 
196e0 75 73 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72  using these oper
196f0 61 74 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  ators */.  sqlit
19700 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
19710 49 64 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f  IdxInfo,   /* Po
19720 70 75 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66  pulated object f
19730 6f 72 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f  or xBestIndex */
19740 0a 20 20 69 6e 74 20 2a 70 62 49 6e 20 20 20 20  .  int *pbIn    
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
19770 69 66 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 20  if plan uses an 
19780 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b  IN(...) op */.){
19790 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
197a0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
197b0 70 57 43 3b 0a 20 20 73 74 72 75 63 74 20 73 71  pWC;.  struct sq
197c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
197d0 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
197e0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
197f0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
19800 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
19810 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
19820 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
19830 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
19840 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20  xTerm;.  int rc 
19850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57  = SQLITE_OK;.  W
19860 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d  hereLoop *pNew =
19870 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
19880 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19890 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
198a0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  nfo->pParse;.  s
198b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
198c0 65 6d 20 2a 70 53 72 63 20 3d 20 26 70 42 75 69  em *pSrc = &pBui
198d0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54  lder->pWInfo->pT
198e0 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
198f0 69 54 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f  iTab];.  int nCo
19900 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
19910 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
19920 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 55  ;..  assert( (mU
19930 73 61 62 6c 65 20 26 20 6d 50 72 65 72 65 71 29  sable & mPrereq)
19940 3d 3d 6d 50 72 65 72 65 71 20 29 3b 0a 20 20 2a  ==mPrereq );.  *
19950 70 62 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77  pbIn = 0;.  pNew
19960 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72  ->prereq = mPrer
19970 65 71 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  eq;..  /* Set th
19980 65 20 75 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e  e usable flag on
19990 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 63   the subset of c
199a0 6f 6e 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74  onstraints ident
199b0 69 66 69 65 64 20 62 79 20 0a 20 20 2a 2a 20 61  ified by .  ** a
199c0 72 67 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65  rguments mUsable
199d0 20 61 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a   and mExclude. *
199e0 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  /.  pIdxCons = *
199f0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19a00 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
19a10 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
19a20 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72  onstraint;.  for
19a30 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
19a40 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
19a50 6e 73 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  ns++){.    Where
19a60 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
19a70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e  WC->a[pIdxCons->
19a80 69 54 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20  iTermOffset];.  
19a90 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
19aa0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  le = 0;.    if( 
19ab0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
19ac0 67 68 74 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d  ght & mUsable)==
19ad0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
19ae0 68 74 20 0a 20 20 20 20 20 26 26 20 28 70 54 65  ht .     && (pTe
19af0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
19b00 6d 45 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20  mExclude)==0.   
19b10 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f   ){.      pIdxCo
19b20 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
19b30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19b40 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
19b50 75 74 70 75 74 20 66 69 65 6c 64 73 20 6f 66 20  utput fields of 
19b60 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
19b70 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
19b80 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55 73   */.  memset(pUs
19b90 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
19ba0 55 73 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74  Usage[0])*nConst
19bb0 72 61 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74  raint);.  assert
19bc0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
19bd0 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20  ToFreeIdxStr==0 
19be0 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  );.  pIdxInfo->i
19bf0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64  dxStr = 0;.  pId
19c00 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
19c10 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
19c20 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
19c30 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
19c40 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
19c50 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
19c60 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49   (double)2;.  pI
19c70 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
19c80 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70 49  dRows = 25;.  pI
19c90 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
19ca0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
19cb0 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c  ->colUsed = (sql
19cc0 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d  ite3_int64)pSrc-
19cd0 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20  >colUsed;..  /* 
19ce0 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72 74 75  Invoke the virtu
19cf0 61 6c 20 74 61 62 6c 65 20 78 42 65 73 74 49 6e  al table xBestIn
19d00 64 65 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a  dex() method */.
19d10 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49    rc = vtabBestI
19d20 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 53 72  ndex(pParse, pSr
19d30 63 2d 3e 70 54 61 62 2c 20 70 49 64 78 49 6e 66  c->pTab, pIdxInf
19d40 6f 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  o);.  if( rc ) r
19d50 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 78 54  eturn rc;..  mxT
19d60 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65  erm = -1;.  asse
19d70 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74  rt( pNew->nLSlot
19d80 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b  >=nConstraint );
19d90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
19da0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20  onstraint; i++) 
19db0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  pNew->aLTerm[i] 
19dc0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
19dd0 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30  tab.omitMask = 0
19de0 3b 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  ;.  pIdxCons = *
19df0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
19e00 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
19e10 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
19e20 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72  onstraint;.  for
19e30 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
19e40 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
19e50 6e 73 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69  ns++){.    int i
19e60 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 28 69  Term;.    if( (i
19e70 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d  Term = pUsage[i]
19e80 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e  .argvIndex - 1)>
19e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
19ea0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
19eb0 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 49 64 78      int j = pIdx
19ec0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
19ed0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65  t;.      if( iTe
19ee0 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
19ef0 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20         || j<0.  
19f00 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e       || j>=pWC->
19f10 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20  nTerm.       || 
19f20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
19f30 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  rm]!=0.       ||
19f40 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
19f50 65 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  e==0.      ){.  
19f60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19f70 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
19f80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19f90 28 70 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73  (pParse,"%s.xBes
19fa0 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
19fb0 6f 6e 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e  on",pSrc->pTab->
19fc0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
19fd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19fe0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
19ff0 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74  e( iTerm==nConst
1a000 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20  raint-1 );.     
1a010 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1a020 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a030 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d  e( j==pWC->nTerm
1a040 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 54 65 72  -1 );.      pTer
1a050 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
1a060 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
1a070 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  eq |= pTerm->pre
1a080 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
1a090 61 73 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e  assert( iTerm<pN
1a0a0 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1a0b0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
1a0c0 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b  [iTerm] = pTerm;
1a0d0 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d  .      if( iTerm
1a0e0 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d  >mxTerm ) mxTerm
1a0f0 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20   = iTerm;.      
1a100 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
1a110 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 74 65 73  =15 );.      tes
1a120 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36  tcase( iTerm==16
1a130 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
1a140 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65  erm<16 && pUsage
1a150 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d  [i].omit ) pNew-
1a160 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
1a170 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20   |= 1<<iTerm;.  
1a180 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1a190 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1a1a0 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
1a1b0 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
1a1c0 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
1a1d0 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
1a1e0 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
1a1f0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75          ** consu
1a200 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  me the ORDER BY 
1a210 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28  clause because (
1a220 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  1) the order of 
1a230 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  IN terms.       
1a240 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   ** is not neces
1a250 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  sarily related t
1a260 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f  o the order of o
1a270 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a  utput terms and.
1a280 20 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d          ** (2) M
1a290 75 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20  ultiple outputs 
1a2a0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e  from a single IN
1a2b0 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
1a2c0 6d 65 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  merge.        **
1a2d0 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20   together.  */. 
1a2e0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
1a2f0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
1a300 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49   = 0;.        pI
1a310 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
1a320 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45   &= ~SQLITE_INDE
1a330 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20  X_SCAN_UNIQUE;. 
1a340 20 20 20 20 20 20 20 2a 70 62 49 6e 20 3d 20 31         *pbIn = 1
1a350 3b 20 61 73 73 65 72 74 28 20 28 6d 45 78 63 6c  ; assert( (mExcl
1a360 75 64 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20  ude & WO_IN)==0 
1a370 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a380 0a 20 20 7d 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c  .  }..  pNew->nL
1a390 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
1a3a0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1a3b0 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
1a3c0 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d  LSlot );.  pNew-
1a3d0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d  >u.vtab.idxNum =
1a3e0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
1a3f0 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  m;.  pNew->u.vta
1a400 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
1a410 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1a420 65 49 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49  eIdxStr;.  pIdxI
1a430 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1a440 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65  dxStr = 0;.  pNe
1a450 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
1a460 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
1a470 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  Str;.  pNew->u.v
1a480 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  tab.isOrdered = 
1a490 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f  (i8)(pIdxInfo->o
1a4a0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f  rderByConsumed ?
1a4b0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
1a4c0 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a  >nOrderBy : 0);.
1a4d0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1a4e0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e   0;.  pNew->rRun
1a4f0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1a500 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
1a510 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1a520 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  st);.  pNew->nOu
1a530 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
1a540 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
1a550 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f  matedRows);..  /
1a560 2a 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f  * Set the WHERE_
1a570 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74  ONEROW flag if t
1a580 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  he xBestIndex() 
1a590 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64  method indicated
1a5a0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
1a5b0 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61  can will visit a
1a5c0 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20  t most one row. 
1a5d0 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69  Clear it otherwi
1a5e0 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  se. */.  if( pId
1a5f0 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1a600 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  & SQLITE_INDEX_S
1a610 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20  CAN_UNIQUE ){.  
1a620 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1a630 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
1a640 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
1a650 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  ew->wsFlags &= ~
1a660 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1a670 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  }.  rc = whereLo
1a680 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1a690 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20  r, pNew);.  if( 
1a6a0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1a6b0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  dFree ){.    sql
1a6c0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
1a6d0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
1a6e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1a6f0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1a700 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
1a710 30 78 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d  0xffff, ("  bIn=
1a720 25 64 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c  %d prereqIn=%04l
1a730 6c 78 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34  lx prereqOut=%04
1a740 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llx\n",.        
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
1a760 62 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69  bIn, (sqlite3_ui
1a770 6e 74 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20  nt64)mPrereq,.  
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e      (sqlite3_uin
1a7a0 74 36 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65  t64)(pNew->prere
1a7b0 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b  q & ~mPrereq)));
1a7c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1a7d0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  .../*.** Add all
1a7e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1a7f0 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
1a800 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
1a810 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
1a820 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
1a830 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
1a840 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1a850 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
1a860 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
1a870 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72  e are no LEFT or
1a880 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e   CROSS JOIN join
1a890 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20  s in the query, 
1a8a0 62 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64  both mPrereq and
1a8b0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72  .** mUnusable ar
1a8c0 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65  e set to 0. Othe
1a8d0 72 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69  rwise, mPrereq i
1a8e0 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20  s a mask of all 
1a8f0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65  FROM clause.** e
1a900 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
1a910 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72  r before the vir
1a920 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68  tual table in th
1a930 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e  e FROM clause an
1a940 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74  d are.** separat
1a950 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
1a960 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
1a970 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53  or CROSS JOIN. S
1a980 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a  imilarly, the.**
1a990 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20   mUnusable mask 
1a9a0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f  contains all FRO
1a9b0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
1a9c0 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65   that occur afte
1a9d0 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  r the.** virtual
1a9e0 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73   table and are s
1a9f0 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
1aa00 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
1aa10 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f   LEFT or .** CRO
1aa20 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20  SS JOIN. .**.** 
1aa30 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1aa40 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a  the query were:.
1aa50 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
1aa60 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49   t1, t2 LEFT JOI
1aa70 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f  N t3, t4, vt CRO
1aa80 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a  SS JOIN t5, t6;.
1aa90 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72  **.** then mPrer
1aaa0 65 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  eq corresponds t
1aab0 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d  o (t1, t2) and m
1aac0 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c  Unusable to (t5,
1aad0 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20   t6)..**.** All 
1aae0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50  the tables in mP
1aaf0 72 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63  rereq must be sc
1ab00 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
1ab10 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1ab20 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61   .** table. So a
1ab30 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
1ab40 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73  ch all prerequis
1ab50 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69  ites are satisfi
1ab60 65 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65  ed by .** mPrere
1ab70 71 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  q may be specifi
1ab80 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
1ab90 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
1aba0 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
1abb0 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
1abc0 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
1abd0 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
1abe0 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
1abf0 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
1ac00 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
1ac10 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
1ac20 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
1ac30 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
1ac40 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
1ac50 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
1ac60 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
1ac70 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
1ac80 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1ac90 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1aca0 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
1acb0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1acc0 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
1acd0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
1ace0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
1acf0 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20   mPrereq,       
1ad00 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1ad10 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1ad20 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
1ad30 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
1ad40 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
1ad50 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
1ad60 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
1ad70 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
1ad80 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   one */.){.  int
1ad90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ada0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1adb0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68  urn code */.  Wh
1adc0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
1add0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
1ade0 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
1adf0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
1ae00 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1ae10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1ae20 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1ae30 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1ae40 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
1ae50 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1ae60 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1ae70 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1ae80 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1ae90 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1aea0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c   search */.  sql
1aeb0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1aec0 2a 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a  *p;       /* Obj
1aed0 65 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ect to pass to x
1aee0 42 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20  BestIndex() */. 
1aef0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1af00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1af10 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1af20 72 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20  raints in p */. 
1af30 20 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20   int bIn;       
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af50 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
1af60 65 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  es IN(...) opera
1af70 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  tor */.  WhereLo
1af80 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d  op *pNew;.  Bitm
1af90 61 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20  ask mBest;      
1afa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1afb0 65 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20  es used by best 
1afc0 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f  possible plan */
1afd0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 6d 50 72  ..  assert( (mPr
1afe0 65 72 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65  ereq & mUnusable
1aff0 29 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f  )==0 );.  pWInfo
1b000 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1b010 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
1b020 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1b030 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72    pWC = pBuilder
1b040 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20  ->pWC;.  pNew = 
1b050 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
1b060 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f    pSrc = &pWInfo
1b070 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
1b080 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73  ew->iTab];.  ass
1b090 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
1b0a0 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20  Src->pTab) );.  
1b0b0 70 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65  p = allocateInde
1b0c0 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57  xInfo(pParse, pW
1b0d0 43 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53  C, mUnusable, pS
1b0e0 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
1b0f0 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
1b100 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1b110 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1b120 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1b130 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c   0;.  pNew->wsFl
1b140 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
1b150 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77  UALTABLE;.  pNew
1b160 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
1b170 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1b180 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f  dFree = 0;.  nCo
1b190 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43  nstraint = p->nC
1b1a0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
1b1b0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
1b1c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65  (pParse->db, pNe
1b1d0 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
1b1e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1b1f0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1b200 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   p);.    return 
1b210 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1b220 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  T;.  }..  /* Fir
1b230 73 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64  st call xBestInd
1b240 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f  ex() with all co
1b250 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65  nstraints usable
1b260 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43  . */.  WHERETRAC
1b270 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1b280 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62  ualOne: all usab
1b290 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20  le\n"));.  rc = 
1b2a0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1b2b0 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1b2c0 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1b2d0 53 2c 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b 0a  S, 0, p, &bIn);.
1b2e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
1b2f0 6c 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28  l to xBestIndex(
1b300 29 20 77 69 74 68 20 61 6c 6c 20 74 65 72 6d 73  ) with all terms
1b310 20 65 6e 61 62 6c 65 64 20 70 72 6f 64 75 63 65   enabled produce
1b320 64 20 61 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68  d a plan.  ** th
1b330 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
1b340 69 72 65 20 61 6e 79 20 73 6f 75 72 63 65 20 74  ire any source t
1b350 61 62 6c 65 73 20 28 49 4f 57 3a 20 61 20 70 6c  ables (IOW: a pl
1b360 61 6e 20 77 69 74 68 20 6d 42 65 73 74 3d 3d 30  an with mBest==0
1b370 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  ),.  ** then the
1b380 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1b390 6e 20 6d 61 6b 69 6e 67 20 61 6e 79 20 66 75 72  n making any fur
1b3a0 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 78 42  ther calls to xB
1b3b0 65 73 74 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a  estIndex() .  **
1b3c0 20 73 69 6e 63 65 20 74 68 65 79 20 77 69 6c 6c   since they will
1b3d0 20 61 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20   all return the 
1b3e0 73 61 6d 65 20 72 65 73 75 6c 74 20 28 69 66 20  same result (if 
1b3f0 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  the xBestIndex()
1b400 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  .  ** implementa
1b410 74 69 6f 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a  tion is sane). *
1b420 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1b430 54 45 5f 4f 4b 20 26 26 20 28 6d 42 65 73 74 20  TE_OK && (mBest 
1b440 3d 20 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  = (pNew->prereq 
1b450 26 20 7e 6d 50 72 65 72 65 71 29 29 21 3d 30 20  & ~mPrereq))!=0 
1b460 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a  ){.    int seenZ
1b470 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
1b480 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1b490 61 20 70 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70  a plan with no p
1b4a0 72 65 72 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20  rereqs seen */. 
1b4b0 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e     int seenZeroN
1b4c0 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  oIN = 0;        
1b4d0 20 2f 2a 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f   /* Plan with no
1b4e0 20 70 72 65 72 65 71 73 20 61 6e 64 20 6e 6f 20   prereqs and no 
1b4f0 49 4e 28 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a  IN(...) seen */.
1b500 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65      Bitmask mPre
1b510 76 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61  v = 0;.    Bitma
1b520 73 6b 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30  sk mBestNoIn = 0
1b530 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1b540 20 70 6c 61 6e 20 70 72 6f 64 75 63 65 64 20 62   plan produced b
1b550 79 20 74 68 65 20 65 61 72 6c 69 65 72 20 63 61  y the earlier ca
1b560 6c 6c 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  ll uses an IN(..
1b570 2e 29 20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20  .) term, call.  
1b580 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20    ** xBestIndex 
1b590 61 67 61 69 6e 2c 20 74 68 69 73 20 74 69 6d 65  again, this time
1b5a0 20 77 69 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65   with IN(...) te
1b5b0 72 6d 73 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f  rms disabled. */
1b5c0 0a 20 20 20 20 69 66 28 20 62 49 6e 20 29 7b 0a  .    if( bIn ){.
1b5d0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1b5e0 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1b5f0 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c  alOne: all usabl
1b600 65 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20  e w/o IN\n"));. 
1b610 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1b620 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1b630 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1b640 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f  eq, ALLBITS, WO_
1b650 49 4e 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20 20  IN, p, &bIn);.  
1b660 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 3d      assert( bIn=
1b670 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73  =0 );.      mBes
1b680 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72  tNoIn = pNew->pr
1b690 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 3b  ereq & ~mPrereq;
1b6a0 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65 73 74  .      if( mBest
1b6b0 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NoIn==0 ){.     
1b6c0 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b     seenZero = 1;
1b6d0 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1b6e0 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  oNoIN = 1;.     
1b6f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b700 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78   Call xBestIndex
1b710 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 64   once for each d
1b720 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20 6f 66  istinct value of
1b730 20 28 70 72 65 72 65 71 52 69 67 68 74 20 26 20   (prereqRight & 
1b740 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20 20 2a  ~mPrereq) .    *
1b750 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  * in the set of 
1b760 74 65 72 6d 73 20 74 68 61 74 20 61 70 70 6c 79  terms that apply
1b770 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1b780 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
1b790 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  */.    while( rc
1b7a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b7b0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1b7c0 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20    Bitmask mNext 
1b7d0 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20  = ALLBITS;.     
1b7e0 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74 3e 30   assert( mNext>0
1b7f0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1b800 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1b810 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1b820 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20  Bitmask mThis = 
1b830 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57  (.            pW
1b840 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61  C->a[p->aConstra
1b850 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
1b860 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 20  et].prereqRight 
1b870 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20 20 20  & ~mPrereq.     
1b880 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1b890 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20 26 26  ( mThis>mPrev &&
1b8a0 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d   mThis<mNext ) m
1b8b0 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20  Next = mThis;.  
1b8c0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50 72 65      }.      mPre
1b8d0 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20  v = mNext;.     
1b8e0 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42   if( mNext==ALLB
1b8f0 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ITS ) break;.   
1b900 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42     if( mNext==mB
1b910 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42  est || mNext==mB
1b920 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e  estNoIn ) contin
1b930 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ue;.      WHERET
1b940 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1b950 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76  irtualOne: mPrev
1b960 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30  =%04llx mNext=%0
1b970 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  4llx\n",.       
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29  (sqlite3_uint64)
1b9a0 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65 33 5f  mPrev, (sqlite3_
1b9b0 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a  uint64)mNext));.
1b9c0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1b9d0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e  LoopAddVirtualOn
1b9e0 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  e(pBuilder, mPre
1b9f0 72 65 71 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72  req, mNext|mPrer
1ba00 65 71 2c 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b  eq, 0, p, &bIn);
1ba10 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
1ba20 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65 71  >prereq==mPrereq
1ba30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1ba40 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1ba50 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73    if( bIn==0 ) s
1ba60 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1ba70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ba80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1ba90 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1baa0 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76 65  x() in the above
1bab0 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66 69   loop did not fi
1bac0 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1bad0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1bae0 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1baf0 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65  at all (i.e. one
1bb00 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1bb10 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 29  e.    ** usable)
1bb20 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68 65  , make a call he
1bb30 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75 72  re with all sour
1bb40 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62 6c  ce tables disabl
1bb50 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ed */.    if( rc
1bb60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1bb70 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20  eenZero==0 ){.  
1bb80 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1bb90 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1bba0 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65  One: all disable
1bbb0 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  d\n"));.      rc
1bbc0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1bbd0 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64  irtualOne(pBuild
1bbe0 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72  er, mPrereq, mPr
1bbf0 65 72 65 71 2c 20 30 2c 20 70 2c 20 26 62 49 6e  ereq, 0, p, &bIn
1bc00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  );.      if( bIn
1bc10 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f  ==0 ) seenZeroNo
1bc20 49 4e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  IN = 1;.    }.. 
1bc30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c     /* If the cal
1bc40 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1bc50 28 29 20 68 61 76 65 20 73 6f 20 66 61 72 20 66  () have so far f
1bc60 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20  ailed to find a 
1bc70 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74  plan.    ** that
1bc80 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75   requires no sou
1bc90 72 63 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c  rce tables at al
1bca0 6c 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75  l and does not u
1bcb0 73 65 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20  se an IN(...).  
1bcc0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d    ** operator, m
1bcd0 61 6b 65 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c  ake a final call
1bce0 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68   to obtain one h
1bcf0 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ere.  */.    if(
1bd00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bd10 26 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d  & seenZeroNoIN==
1bd20 30 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  0 ){.      WHERE
1bd30 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1bd40 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1bd50 64 69 73 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f  disabled and w/o
1bd60 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20   IN\n"));.      
1bd70 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1bd80 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69  dVirtualOne(pBui
1bd90 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1bda0 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70  Prereq, WO_IN, p
1bdb0 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  , &bIn);.    }. 
1bdc0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65   }..  if( p->nee
1bdd0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
1bde0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1bdf0 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
1be00 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1be10 3e 64 62 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  >db, p);.  retur
1be20 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1be30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1be40 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
1be50 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f  *.** Add WhereLo
1be60 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61  op entries to ha
1be70 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20  ndle OR terms.  
1be80 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65  This works for e
1be90 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20  ither.** btrees 
1bea0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1beb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1bec0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1bed0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
1bee0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a  der *pBuilder, .
1bef0 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1bf00 71 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55  q, .  Bitmask mU
1bf10 6e 75 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65  nusable.){.  Whe
1bf20 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
1bf30 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1bf40 6f 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  o;.  WhereClause
1bf50 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f   *pWC;.  WhereLo
1bf60 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72  op *pNew;.  Wher
1bf70 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
1bf80 57 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20  WCEnd;.  int rc 
1bf90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1bfa0 6e 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65  nt iCur;.  Where
1bfb0 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
1bfc0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1bfd0 72 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57  r sSubBuild;.  W
1bfe0 68 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20  hereOrSet sSum, 
1bff0 73 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53  sCur;.  struct S
1c000 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1c010 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70  em;.  .  pWC = p
1c020 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20  Builder->pWC;.  
1c030 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
1c040 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
1c050 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1c060 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
1c070 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
1c080 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
1c090 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1c0a0 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
1c0b0 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  Tab;.  iCur = pI
1c0c0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20  tem->iCursor;.. 
1c0d0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
1c0e0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
1c0f0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1c100 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
1c110 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1c120 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
1c130 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
1c140 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
1c150 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
1c160 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
1c170 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
1c180 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
1c190 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
1c1a0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
1c1b0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
1c1c0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
1c1d0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
1c1e0 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
1c1f0 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
1c200 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
1c210 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
1c220 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
1c230 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
1c240 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
1c250 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
1c260 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
1c270 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
1c280 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48  &sCur;..      WH
1c290 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
1c2a0 28 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69  ("Begin processi
1c2b0 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c  ng OR-clause %p\
1c2c0 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20  n", pTerm));.   
1c2d0 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
1c2e0 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
1c2f0 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
1c300 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1c310 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
1c320 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
1c330 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1c340 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
1c350 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
1c360 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
1c370 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
1c380 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
1c390 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
1c3a0 20 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66      tempWC.pWInf
1c3b0 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
1c3c0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
1c3d0 43 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a  C.pOuter = pWC;.
1c3e0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1c3f0 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
1c400 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
1c410 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
1c420 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70      tempWC.a = p
1c430 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  OrTerm;.        
1c440 20 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20    sSubBuild.pWC 
1c450 3d 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  = &tempWC;.     
1c460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c470 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1c480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c490 73 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64  sCur.n = 0;.#ifd
1c4a0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
1c4b0 41 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48  ABLED.        WH
1c4c0 45 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20  ERETRACE(0x200, 
1c4d0 28 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20  ("OR-term %d of 
1c4e0 25 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72  %p has %d subter
1c4f0 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  ms:\n", .       
1c500 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
1c510 29 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d  )(pOrTerm-pOrWC-
1c520 3e 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62  >a), pTerm, sSub
1c530 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d  Build.pWC->nTerm
1c540 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1c550 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
1c560 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
1c570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1c580 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73  ereClausePrint(s
1c590 53 75 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20  SubBuild.pWC);. 
1c5a0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
1c5b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c5c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1c5d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
1c5e0 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
1c5f0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
1c600 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1c610 64 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42  ddVirtual(&sSubB
1c620 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d  uild, mPrereq, m
1c630 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20  Unusable);.     
1c640 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1c650 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1c660 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1c670 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
1c680 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b  Build, mPrereq);
1c690 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c6a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c6b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c6c0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1c6d0 41 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64  AddOr(&sSubBuild
1c6e0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1c6f0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  able);.        }
1c700 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1c720 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20  | sCur.n==0 );. 
1c730 20 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e         if( sCur.
1c740 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1c750 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1c760 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c770 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c780 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
1c790 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
1c7a0 73 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20  sSum, &sCur);.  
1c7b0 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
1c7c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c7d0 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
1c7e0 4f 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20  OrSet sPrev;.   
1c7f0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
1c800 76 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d  ve(&sPrev, &sSum
1c810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  );.          sSu
1c820 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1c830 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50     for(i=0; i<sP
1c840 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  rev.n; i++){.   
1c850 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1c860 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29  ; j<sCur.n; j++)
1c870 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c880 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73  whereOrInsert(&s
1c890 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e  Sum, sPrev.a[i].
1c8a0 70 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b  prereq | sCur.a[
1c8b0 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20  j].prereq,.     
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1c8e0 67 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b  gEstAdd(sPrev.a[
1c8f0 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b  i].rRun, sCur.a[
1c900 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20  j].rRun),.      
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
1c930 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
1c940 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a  ].nOut, sCur.a[j
1c950 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20  ].nOut));.      
1c960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c970 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1c980 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
1c990 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
1c9a0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
1c9b0 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [0] = pTerm;.   
1c9c0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1c9d0 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
1c9e0 52 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  R;.      pNew->r
1c9f0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
1ca00 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
1ca10 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  = 0;.      memse
1ca20 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73  t(&pNew->u, 0, s
1ca30 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b  izeof(pNew->u));
1ca40 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1ca50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ca60 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b   i<sSum.n; i++){
1ca70 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
1ca80 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53  NG: Currently sS
1ca90 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20  um.a[i].rRun is 
1caa0 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  set to the sum o
1cab0 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20  f the costs.    
1cac0 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75      ** of all su
1cad0 62 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64  b-scans required
1cae0 20 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e   by the OR-scan.
1caf0 20 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f   However, due to
1cb00 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20   rounding.      
1cb10 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20    ** errors, it 
1cb20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20  may be that the 
1cb30 63 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73  cost of the OR-s
1cb40 63 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20  can is equal to 
1cb50 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  its.        ** m
1cb60 6f 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75  ost expensive su
1cb70 62 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20  b-scan. Add the 
1cb80 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c  smallest possibl
1cb90 65 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20  e penalty .     
1cba0 20 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e     ** (equivalen
1cbb0 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67  t to multiplying
1cbc0 20 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30   the cost by 1.0
1cbd0 37 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  7) to ensure tha
1cbe0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  t .        ** th
1cbf0 69 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70  is does not happ
1cc00 65 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  en. Otherwise, f
1cc10 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
1cc20 20 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20   such as the.   
1cc30 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
1cc40 67 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73  g where there is
1cc50 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22   an index on "y"
1cc60 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
1cc70 20 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52       **     WHER
1cc80 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f  E likelihood(x=?
1cc90 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20  , 0.99) OR y=?. 
1cca0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1ccb0 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72    ** the planner
1ccc0 20 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f   may elect to "O
1ccd0 52 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75  R" together a fu
1cce0 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e  ll-table scan an
1ccf0 64 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  d an.        ** 
1cd00 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e  index lookup. An
1cd10 64 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c  d other similarl
1cd20 79 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20  y odd results.  
1cd30 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
1cd40 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69  >rRun = sSum.a[i
1cd50 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20  ].rRun + 1;.    
1cd60 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
1cd70 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b   sSum.a[i].nOut;
1cd80 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
1cd90 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69  rereq = sSum.a[i
1cda0 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20  ].prereq;.      
1cdb0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1cdc0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1cdd0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
1cde0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1cdf0 28 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72  (0x200, ("End pr
1ce00 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
1ce10 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
1ce20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1ce30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ce40 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
1ce50 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
1ce60 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a   all tables .*/.
1ce70 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1ce80 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65  LoopAddAll(Where
1ce90 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1cea0 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
1ceb0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
1cec0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1ced0 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1cee0 71 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b  q = 0;.  Bitmask
1cef0 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69   mPrior = 0;.  i
1cf00 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69  nt iTab;.  SrcLi
1cf10 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
1cf20 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
1cf30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1cf40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1cf50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cf60 69 74 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54  item *pEnd = &pT
1cf70 61 62 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f  abList->a[pWInfo
1cf80 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c  ->nLevel];.  sql
1cf90 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
1cfa0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
1cfb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cfc0 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  _OK;.  WhereLoop
1cfd0 20 2a 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69   *pNew;.  u8 pri
1cfe0 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  orJointype = 0;.
1cff0 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
1d000 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
1d010 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
1d020 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
1d030 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
1d040 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f  >pNew;.  whereLo
1d050 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20  opInit(pNew);.  
1d060 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
1d070 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70  m=pTabList->a; p
1d080 49 74 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b  Item<pEnd; iTab+
1d090 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1d0a0 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1d0b0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  le = 0;.    pNew
1d0c0 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
1d0d0 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c     pNew->maskSel
1d0e0 66 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  f = sqlite3Where
1d0f0 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
1d100 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d  >sMaskSet, pItem
1d110 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
1d120 69 66 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e  if( ((pItem->fg.
1d130 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f  jointype|priorJo
1d140 69 6e 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45  intype) & (JT_LE
1d150 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
1d160 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1d170 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
1d180 72 75 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69  rue when pItem i
1d190 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  s the FROM claus
1d1a0 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20  e term on the.  
1d1b0 20 20 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e      ** right-han
1d1c0 64 2d 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54  d-side of a LEFT
1d1d0 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20   or CROSS JOIN. 
1d1e0 20 2a 2f 0a 20 20 20 20 20 20 6d 50 72 65 72 65   */.      mPrere
1d1f0 71 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20  q = mPrior;.    
1d200 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74  }.    priorJoint
1d210 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e  ype = pItem->fg.
1d220 6a 6f 69 6e 74 79 70 65 3b 0a 23 69 66 6e 64 65  jointype;.#ifnde
1d230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1d240 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
1d250 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
1d260 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
1d270 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1d280 74 5f 69 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20  t_item *p;.     
1d290 20 66 6f 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d   for(p=&pItem[1]
1d2a0 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
1d2b0 20 20 20 20 20 20 20 20 69 66 28 20 6d 55 6e 75          if( mUnu
1d2c0 73 61 62 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e  sable || (p->fg.
1d2d0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
1d2e0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29  EFT|JT_CROSS)) )
1d2f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 55 6e 75  {.          mUnu
1d300 73 61 62 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33  sable |= sqlite3
1d310 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
1d320 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
1d330 70 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  p->iCursor);.   
1d340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1d350 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1d360 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 70 42  oopAddVirtual(pB
1d370 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1d380 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
1d390 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#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 20 20 20  TUALTABLE */.   
1d3c0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68   {.      rc = wh
1d3d0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1d3e0 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1d3f0 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  q);.    }.    if
1d400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d410 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
1d420 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75  ereLoopAddOr(pBu
1d430 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20  ilder, mPrereq, 
1d440 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1d450 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
1d460 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
1d470 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
1d480 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1d490 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77   break;.  }..  w
1d4a0 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
1d4b0 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
1d4c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
1d4d0 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61  xamine a WherePa
1d4e0 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64  th (with the add
1d4f0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74  ition of the ext
1d500 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20  ra WhereLoop of 
1d510 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d  the 5th.** param
1d520 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66  eters) to see if
1d530 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73   it outputs rows
1d540 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
1d550 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f  d ORDER BY.** (o
1d560 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68  r GROUP BY) with
1d570 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20  out requiring a 
1d580 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70  separate sort op
1d590 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  eration.  Return
1d5a0 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30   N:.** .**   N>0
1d5b0 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74  :   N terms of t
1d5c0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1d5d0 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64  se are satisfied
1d5e0 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20  .**   N==0:  No 
1d5f0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1d600 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
1d610 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20   satisfied.**   
1d620 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79  N<0:   Unknown y
1d630 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d  et how many term
1d640 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69  s of ORDER BY mi
1d650 67 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64  ght be satisfied
1d660 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  .   .**.** Note 
1d670 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20  that processing 
1d680 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42  for WHERE_GROUPB
1d690 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54  Y and WHERE_DIST
1d6a0 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73  INCTBY is not as
1d6b0 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74  .** strict.  Wit
1d6c0 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44  h GROUP BY and D
1d6d0 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79  ISTINCT the only
1d6e0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20   requirement is 
1d6f0 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65  that.** equivale
1d700 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69  nt rows appear i
1d710 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63  mmediately adjac
1d720 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68  ent to one anoth
1d730 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a  er.  GROUP BY.**
1d740 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f   and DISTINCT do
1d750 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77   not require row
1d760 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61  s to appear in a
1d770 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72  ny particular or
1d780 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61  der as long.** a
1d790 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  s equivalent row
1d7a0 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f  s are grouped to
1d7b0 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f  gether.  Thus fo
1d7c0 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44  r GROUP BY and D
1d7d0 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70  ISTINCT.** the p
1d7e0 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61  OrderBy terms ca
1d7f0 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  n be matched in 
1d800 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68  any order.  With
1d810 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a   ORDER BY, the .
1d820 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  ** pOrderBy term
1d830 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65  s must be matche
1d840 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74  d in strict left
1d850 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e  -to-right order.
1d860 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68  .*/.static i8 wh
1d870 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
1d880 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
1d890 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
1d8a0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1d8b0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
1d8c0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
1d8d0 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  /* ORDER BY or G
1d8e0 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49  ROUP BY or DISTI
1d8f0 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68  NCT clause to ch
1d900 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  eck */.  WherePa
1d910 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f  th *pPath,     /
1d920 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20  * The WherePath 
1d930 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31  to check */.  u1
1d940 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
1d950 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f      /* WHERE_GRO
1d960 55 50 42 59 20 6f 72 20 5f 44 49 53 54 49 4e 43  UPBY or _DISTINC
1d970 54 42 59 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f  TBY or _ORDERBY_
1d980 4c 49 4d 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e  LIMIT */.  u16 n
1d990 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Loop,           
1d9a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1d9b0 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d 3e  tries in pPath->
1d9c0 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65  aLoop[] */.  Whe
1d9d0 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20  reLoop *pLast,  
1d9e0 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 57     /* Add this W
1d9f0 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20  hereLoop to the 
1da00 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c  end of pPath->aL
1da10 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61  oop[] */.  Bitma
1da20 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20 20  sk *pRevMask    
1da30 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66   /* OUT: Mask of
1da40 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72   WhereLoops to r
1da50 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  un in reverse or
1da60 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72  der */.){.  u8 r
1da70 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  evSet;          
1da80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 76    /* True if rev
1da90 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75   is known */.  u
1daa0 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  8 rev;          
1dab0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74       /* Composit
1dac0 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  e sort order */.
1dad0 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20 20    u8 revIdx;    
1dae0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1daf0 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20   sort order */. 
1db00 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74 69   u8 isOrderDisti
1db10 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72  nct;   /* All pr
1db20 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 61  ior WhereLoops a
1db30 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  re order-distinc
1db40 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69 6e  t */.  u8 distin
1db50 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20  ctColumns;   /* 
1db60 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f 70  True if the loop
1db70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54 20   has UNIQUE NOT 
1db80 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
1db90 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20 20    u8 isMatch;   
1dba0 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75          /* iColu
1dbb0 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65 72  mn matches a ter
1dbc0 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
1dbd0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31  Y clause */.  u1
1dbe0 36 20 65 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20  6 eqOpMask;     
1dbf0 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65      /* Allowed e
1dc00 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
1dc10 73 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43  s */.  u16 nKeyC
1dc20 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol;          /* 
1dc30 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f  Number of key co
1dc40 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20  lumns in pIndex 
1dc50 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e  */.  u16 nColumn
1dc60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1dc70 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72  tal number of or
1dc80 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e  dered columns in
1dc90 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
1dca0 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  u16 nOrderBy;   
1dcb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dcc0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
1dcd0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1dce0 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20    int iLoop;    
1dcf0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1dd00 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e   of WhereLoop in
1dd10 20 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f   pPath being pro
1dd20 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  cessed */.  int 
1dd30 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1dd40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1dd50 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1dd60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1dd70 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
1dd80 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65  or current Where
1dd90 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  Loop */.  int iC
1dda0 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
1ddb0 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  /* A column numb
1ddc0 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20  er within table 
1ddd0 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  iCur */.  WhereL
1dde0 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20  oop *pLoop = 0; 
1ddf0 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65  /* Current Where
1de00 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65  Loop being proce
1de10 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65  ssed. */.  Where
1de20 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1de30 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
1de40 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
1de50 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
1de60 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20  *pOBExpr;       
1de70 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f   /* An expressio
1de80 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52  n from the ORDER
1de90 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1dea0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1deb0 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45        /* COLLATE
1dec0 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61   function from a
1ded0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1dee0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65  e term */.  Inde
1def0 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1df00 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61    /* The index a
1df10 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1df20 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Loop */.  sqlite
1df30 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
1df40 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
1df50 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1df60 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
1df70 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f   obSat = 0;    /
1df80 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20  * Mask of ORDER 
1df90 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
1dfa0 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42  ed so far */.  B
1dfb0 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20  itmask obDone;  
1dfc0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1dfd0 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
1dfe0 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
1dff0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
1e000 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61  k;  /* Mask of a
1e010 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20  ll well-ordered 
1e020 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61  loops */.  Bitma
1e030 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20  sk ready;       
1e040 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1e050 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
1e060 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  /*.  ** We s
1e070 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
1e080 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66   is "one-row" if
1e090 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f   it generates no
1e0a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20   more than one. 
1e0b0 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75   ** row of outpu
1e0c0 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  t.  A WhereLoop 
1e0d0 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c  is one-row if al
1e0e0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1e0f0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ng are true:.  *
1e100 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78  *  (a) All index
1e110 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77   columns match w
1e120 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ith WHERE_COLUMN
1e130 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54  _EQ..  **  (b) T
1e140 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71  he index is uniq
1e150 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72  ue.  ** Any Wher
1e160 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48  eLoop with an WH
1e170 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f  ERE_COLUMN_EQ co
1e180 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
1e190 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77  rowid is one-row
1e1a0 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65  ..  ** Every one
1e1b0 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77  -row WhereLoop w
1e1c0 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45  ill have the WHE
1e1d0 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65  RE_ONEROW bit se
1e1e0 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20  t in wsFlags..  
1e1f0 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  **.  ** We say t
1e200 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
1e210 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22  "order-distinct"
1e220 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   if the set of c
1e230 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a  olumns from.  **
1e240 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20   that WhereLoop 
1e250 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
1e260 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1e270 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f  are different fo
1e280 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77  r every.  ** row
1e290 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
1e2a0 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f  p.  Every one-ro
1e2b0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61  w WhereLoop is a
1e2c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a  utomatically.  *
1e2d0 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  * order-distinct
1e2e0 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20  .   A WhereLoop 
1e2f0 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75  that has no colu
1e300 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mns in the ORDER
1e310 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
1e320 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73  is not order-dis
1e330 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64  tinct. To be ord
1e340 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e  er-distinct is n
1e350 6f 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d  ot quite the sam
1e360 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20  e as being.  ** 
1e370 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55  UNIQUE since a U
1e380 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20  NIQUE column or 
1e390 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d  index can have m
1e3a0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61  ultiple rows tha
1e3b0 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  t .  ** are NULL
1e3c0 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
1e3d0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20   are equivalent 
1e3e0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
1e3f0 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  of order-distinc
1e400 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72  t..  ** To be or
1e410 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68  der-distinct, th
1e420 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62  e columns must b
1e430 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54  e UNIQUE and NOT
1e440 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
1e450 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61   The rowid for a
1e460 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
1e470 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
1e480 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72  NULL so whenever
1e490 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20   the.  ** rowid 
1e4a0 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f  appears in the O
1e4b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1e4c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1e4d0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20  g WhereLoop is. 
1e4e0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
1e4f0 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  y order-distinct
1e500 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ..  */..  assert
1e510 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ( pOrderBy!=0 );
1e520 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20  .  if( nLoop && 
1e530 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
1e540 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
1e550 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20  OrderByIdxJoin) 
1e560 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
1e570 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1e580 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73  By->nExpr;.  tes
1e590 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d  tcase( nOrderBy=
1e5a0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20  =BMS-1 );.  if( 
1e5b0 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29  nOrderBy>BMS-1 )
1e5c0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
1e5d0 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f  annot optimize o
1e5e0 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45  verly large ORDE
1e5f0 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64  R BYs */.  isOrd
1e600 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a  erDistinct = 1;.
1e610 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42    obDone = MASKB
1e620 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a  IT(nOrderBy)-1;.
1e630 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
1e640 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79  ask = 0;.  ready
1e650 20 3d 20 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b   = 0;.  eqOpMask
1e660 20 3d 20 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53   = WO_EQ | WO_IS
1e670 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   | WO_ISNULL;.  
1e680 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
1e690 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c   WHERE_ORDERBY_L
1e6a0 49 4d 49 54 20 29 20 65 71 4f 70 4d 61 73 6b 20  IMIT ) eqOpMask 
1e6b0 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28  |= WO_IN;.  for(
1e6c0 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72  iLoop=0; isOrder
1e6d0 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61  Distinct && obSa
1e6e0 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f  t<obDone && iLoo
1e6f0 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  p<=nLoop; iLoop+
1e700 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  +){.    if( iLoo
1e710 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70  p>0 ) ready |= p
1e720 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
1e730 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c      if( iLoop<nL
1e740 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  oop ){.      pLo
1e750 6f 70 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  op = pPath->aLoo
1e760 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20  p[iLoop];.      
1e770 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
1e780 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c   WHERE_ORDERBY_L
1e790 49 4d 49 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  IMIT ) continue;
1e7a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e7b0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b    pLoop = pLast;
1e7c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e7d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1e7e0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1e7f0 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LE ){.      if( 
1e800 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73  pLoop->u.vtab.is
1e810 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61 74 20  Ordered ) obSat 
1e820 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20  = obDone;.      
1e830 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e840 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
1e850 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
1e860 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
1e870 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
1e880 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
1e890 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
1e8a0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
1e8b0 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
1e8c0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
1e8d0 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
1e8e0 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
1e8f0 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
1e900 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
1e910 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
1e920 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
1e930 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
1e940 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
1e950 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
1e960 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
1e970 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
1e980 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
1e990 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
1e9a0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1e9b0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
1e9c0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
1e9d0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
1e9e0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
1e9f0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
1ea00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
1ea10 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
1ea20 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
1ea30 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
1ea40 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d  te3WhereFindTerm
1ea50 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69  (&pWInfo->sWC, i
1ea60 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43  Cur, pOBExpr->iC
1ea70 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72                ~r
1ea90 65 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20  eady, eqOpMask, 
1eaa0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  0);.      if( pT
1eab0 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
1eac0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
1ead0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
1eae0 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
1eaf0 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f   && pOBExpr->iCo
1eb00 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
1eb10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1eb20 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  1, *z2;.        
1eb30 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1eb40 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
1eb50 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65  o->pParse, pOrde
1eb60 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1eb70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
1eb80 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1eb90 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1eba0 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c        z1 = pColl
1ebb0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
1ebc0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1ebd0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
1ebe0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72  fo->pParse, pTer
1ebf0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1ec00 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1ec10 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1ec20 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a  tColl;.        z
1ec30 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  2 = pColl->zName
1ec40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1ec50 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1ec60 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e   z2)!=0 ) contin
1ec70 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ue;.        test
1ec80 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
1ec90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
1eca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f  .      }.      o
1ecb0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1ecc0 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  i);.    }..    i
1ecd0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1ece0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
1ecf0 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  W)==0 ){.      i
1ed00 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1ed10 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b  s & WHERE_IPK ){
1ed20 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
1ed30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65  = 0;.        nKe
1ed40 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
1ed50 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20    nColumn = 1;. 
1ed60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1ed70 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
1ed80 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d  u.btree.pIndex)=
1ed90 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55  =0 || pIndex->bU
1eda0 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20  nordered ){.    
1edb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1edc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1edd0 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e     nKeyCol = pIn
1ede0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  dex->nKeyCol;.  
1edf0 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
1ee00 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
1ee10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ee20 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f   nColumn==nKeyCo
1ee30 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  l+1 || !HasRowid
1ee40 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
1ee50 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1ee60 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  rt( pIndex->aiCo
1ee70 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d  lumn[nColumn-1]=
1ee80 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20  =XN_ROWID.      
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
1eeb0 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
1eec0 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
1eed0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55  erDistinct = IsU
1eee0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
1eef0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
1ef00 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
1ef10 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
1ef20 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
1ef30 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
1ef40 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
1ef50 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
1ef60 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
1ef70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1ef80 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
1ef90 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63  0;.      distinc
1efa0 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20  tColumns = 0;.  
1efb0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1efc0 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
1efd0 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20        u8 bOnce; 
1efe0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e    /* True to run
1eff0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65   the ORDER BY se
1f000 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  arch loop */..  
1f010 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76        /* Skip ov
1f020 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61 6e 64  er == and IS and
1f030 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e 0a 20   ISNULL terms.. 
1f040 20 20 20 20 20 20 20 2a 2a 20 28 41 6c 73 6f 20         ** (Also 
1f050 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77 68  skip IN terms wh
1f060 65 6e 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f  en doing WHERE_O
1f070 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f  RDERBY_LIMIT pro
1f080 63 65 73 73 69 6e 67 29 0a 20 20 20 20 20 20 20  cessing).       
1f090 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1f0a0 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
1f0b0 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
1f0c0 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30   pLoop->nSkip==0
1f0d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69  .         && ((i
1f0e0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1f0f0 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20  [j]->eOperator) 
1f100 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 0a 20  & eqOpMask)!=0. 
1f110 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1f120 20 20 20 20 69 66 28 20 69 20 26 20 57 4f 5f 49      if( i & WO_I
1f130 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
1f140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1f150 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
1f160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
1f170 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
1f180 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
1f190 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1f1a0 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e;  .        }..
1f1b0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74          /* Get t
1f1c0 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
1f1d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69   in the table (i
1f1e0 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74  Column) and sort
1f1f0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
1f200 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74  * (revIdx) for t
1f210 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he j-th column o
1f220 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  f the index..   
1f230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f240 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
1f250 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
1f260 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
1f270 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  mn[j];.         
1f280 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78   revIdx = pIndex
1f290 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
1f2a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1f2b0 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e  Column==pIndex->
1f2c0 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20  pTable->iPKey ) 
1f2d0 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
1f2e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f2f0 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
1f300 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20   XN_ROWID;.     
1f310 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b       revIdx = 0;
1f320 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f330 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73      /* An uncons
1f340 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74  trained column t
1f350 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  hat might be NUL
1f360 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  L means that thi
1f370 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  s.        ** Whe
1f380 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65  reLoop is not we
1f390 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20  ll-ordered.     
1f3a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1f3b0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
1f3c0 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43  t.         && iC
1f3d0 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20  olumn>=0.       
1f3e0 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75    && j>=pLoop->u
1f3f0 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20  .btree.nEq.     
1f400 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70      && pIndex->p
1f410 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
1f420 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a  umn].notNull==0.
1f430 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1f440 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
1f450 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
1f460 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1f470 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42  Find the ORDER B
1f480 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72  Y term that corr
1f490 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a  esponds to the j
1f4a0 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20  -th column.     
1f4b0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64     ** of the ind
1f4c0 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74  ex and mark that
1f4d0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f   ORDER BY term o
1f4e0 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ff .        */. 
1f4f0 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31         bOnce = 1
1f500 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  ;.        isMatc
1f510 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  h = 0;.        f
1f520 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26  or(i=0; bOnce &&
1f530 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
1f540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1f550 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
1f560 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
1f570 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70            pOBExp
1f580 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
1f590 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
1f5a0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1f5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
1f5c0 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
1f5d0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1f5e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
1f5f0 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1f600 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
1f610 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20  NCTBY );.       
1f620 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
1f630 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55  gs & (WHERE_GROU
1f640 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  PBY|WHERE_DISTIN
1f650 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63  CTBY))==0 ) bOnc
1f660 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1f670 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 28 2d   if( iColumn>=(-
1f680 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
1f690 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
1f6a0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
1f6b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1f6c0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
1f6d0 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
1f6e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f6f0 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1f700 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
1f710 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
1f720 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1f740 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
1f750 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70 49 6e  pare(pOBExpr,pIn
1f760 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  dex->aColExpr->a
1f770 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 29 20  [j].pExpr,iCur) 
1f780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f790 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f7a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1f7c0 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  f( iColumn>=0 ){
1f7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1f7e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1f7f0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1f800 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1f810 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1f820 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
1f830 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
1f840 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
1f850 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1f860 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1f870 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  oll->zName, pInd
1f880 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d  ex->azColl[j])!=
1f890 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1f8a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f8b0 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
1f8c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1f8d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f8e0 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
1f8f0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
1f900 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
1f910 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1f920 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1f930 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
1f940 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
1f950 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1f960 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
1f970 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
1f980 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
1f990 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
1f9a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f9b0 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
1f9c0 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
1f9d0 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
1f9e0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
1f9f0 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b  r ) isMatch = 0;
1fa00 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1fa10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1fa20 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
1fa30 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
1fa40 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
1fa50 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
1fa60 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
1fa70 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
1fa80 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
1fa90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1faa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fab0 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
1fac0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
1fad0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1fae0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1faf0 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d  distinctColumns=
1fb00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1fb10 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e    distinctColumn
1fb20 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
1fb30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53   }.          obS
1fb40 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
1fb50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1fb60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
1fb70 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a   match found */.
1fb80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
1fb90 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20  =0 || j<nKeyCol 
1fba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
1fbb0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
1fbc0 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20  Distinct!=0 );. 
1fbd0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
1fbe0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
1fbf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fc00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fc10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
1fc20 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20  * end Loop over 
1fc30 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  all index column
1fc40 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64  s */.      if( d
1fc50 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29  istinctColumns )
1fc60 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1fc70 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
1fc80 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct==0 );.      
1fc90 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
1fca0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
1fcb0 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e     } /* end-if n
1fcc0 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20  ot one-row */.. 
1fcd0 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61     /* Mark off a
1fce0 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42  ny other ORDER B
1fcf0 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65 66  Y terms that ref
1fd00 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a  erence pLoop */.
1fd10 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 44      if( isOrderD
1fd20 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
1fd30 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
1fd40 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sk |= pLoop->mas
1fd50 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72  kSelf;.      for
1fd60 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
1fd70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1fd80 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20  Expr *p;.       
1fd90 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a   Bitmask mTerm;.
1fda0 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
1fdb0 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
1fdc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1fdd0 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
1fde0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1fdf0 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71 6c       mTerm = sql
1fe00 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61  ite3WhereExprUsa
1fe10 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ge(&pWInfo->sMas
1fe20 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20  kSet,p);.       
1fe30 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26   if( mTerm==0 &&
1fe40 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
1fe50 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e  onstant(p) ) con
1fe60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1fe70 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72  f( (mTerm&~order
1fe80 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30  DistinctMask)==0
1fe90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62   ){.          ob
1fea0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
1feb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1fec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f     }.    }.  } /
1fed0 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f  * End the loop o
1fee0 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  ver all WhereLoo
1fef0 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f  ps from outer-mo
1ff00 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72  st down to inner
1ff10 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f  -most */.  if( o
1ff20 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72  bSat==obDone ) r
1ff30 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72  eturn (i8)nOrder
1ff40 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64  By;.  if( !isOrd
1ff50 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  erDistinct ){.  
1ff60 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79    for(i=nOrderBy
1ff70 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
1ff80 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
1ff90 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b   MASKBIT(i) - 1;
1ffa0 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53 61  .      if( (obSa
1ffb0 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e  t&m)==m ) return
1ffc0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   i;.    }.    re
1ffd0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
1ffe0 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn -1;.}.../*.
1fff0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 5f  ** If the WHERE_
20000 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
20010 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20  set in the mask 
20020 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
20030 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a  3WhereBegin(),.*
20040 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73  * the planner as
20050 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 73  sumes that the s
20060 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72 42  pecified pOrderB
20070 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c  y list is actual
20080 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59  ly a GROUP.** BY
20090 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f   clause - and so
200a0 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20   any order that 
200b0 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72  groups rows as r
200c0 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69 65  equired satisfie
200d0 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  s the.** request
200e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
200f0 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  , in this case i
20100 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
20110 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  e for the caller
20120 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   to determine.**
20130 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
20140 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65 61  the rows are rea
20150 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65  lly being delive
20160 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  red in sorted or
20170 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20  der, or.** just 
20180 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72  in some other or
20190 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64 65  der that provide
201a0 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 67  s the required g
201b0 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72  rouping. However
201c0 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52  ,.** if the WHER
201d0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c  E_SORTBYGROUP fl
201e0 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65  ag is also passe
201f0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
20200 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a  eBegin(), then.*
20210 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
20220 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  may be called on
20230 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57 68   the returned Wh
20240 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  ereInfo object. 
20250 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72  It returns.** tr
20260 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20 72  ue if the rows r
20270 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f  eally will be so
20280 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65 63  rted in the spec
20290 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20  ified order, or 
202a0 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69  false.** otherwi
202b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  se..**.** For ex
202c0 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a  ample, assuming:
202d0 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
202e0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78  INDEX i1 ON t1(x
202f0 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , Y);.**.** then
20300 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
20310 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  * FROM t1 GROUP 
20320 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20  BY x,y ORDER BY 
20330 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74  x,y;   -- IsSort
20340 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c  ed()==1.**   SEL
20350 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
20360 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52  OUP BY y,x ORDER
20370 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73   BY y,x;   -- Is
20380 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69  Sorted()==0.*/.i
20390 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
203a0 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66  sSorted(WhereInf
203b0 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
203c0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
203d0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
203e0 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73  _GROUPBY );.  as
203f0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63  sert( pWInfo->wc
20400 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
20410 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a  _SORTBYGROUP );.
20420 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
20430 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64  >sorted;.}..#ifd
20440 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
20450 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62  ABLED./* For deb
20460 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a  ugging use only:
20470 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
20480 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74 68   char *wherePath
20490 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a  Name(WherePath *
204a0 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70  pPath, int nLoop
204b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61  , WhereLoop *pLa
204c0 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  st){.  static ch
204d0 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20  ar zName[65];.  
204e0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
204f0 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b  ; i<nLoop; i++){
20500 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74   zName[i] = pPat
20510 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64  h->aLoop[i]->cId
20520 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20  ; }.  if( pLast 
20530 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70  ) zName[i++] = p
20540 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61  Last->cId;.  zNa
20550 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74  me[i] = 0;.  ret
20560 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
20570 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
20580 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f  n the cost of so
20590 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c  rting nRow rows,
205a0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
205b0 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a  he keys have .**
205c0 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e   nOrderby column
205d0 73 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 66  s and that the f
205e0 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c  irst nSorted col
205f0 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79  umns are already
20600 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f   in.** order..*/
20610 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77  .static LogEst w
20620 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28  hereSortingCost(
20630 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
20640 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e  Info,.  LogEst n
20650 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65  Row,.  int nOrde
20660 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74  rBy,.  int nSort
20670 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e  ed.){.  /* TUNIN
20680 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73  G: Estimated cos
20690 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65  t of a full exte
206a0 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65  rnal sort, where
206b0 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20   N is .  ** the 
206c0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
206d0 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a  o sort is:.  **.
206e0 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33    **   cost = (3
206f0 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29  .0 * N * log(N))
20700 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c  ..  ** .  ** Or,
20710 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   if the order-by
20720 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74 65   clause has X te
20730 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65  rms but only the
20740 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65   last Y .  ** te
20750 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f  rms are out of o
20760 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b  rder, then block
20770 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65  -sorting will re
20780 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73  duce the .  ** s
20790 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a  orting cost to:.
207a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74    **.  **   cost
207b0 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f   = (3.0 * N * lo
207c0 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20  g(N)) * (Y/X).  
207d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58  **.  ** The (Y/X
207e0 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d  ) term is implem
207f0 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61 63  ented using stac
20800 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c  k variable rScal
20810 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a  e.  ** below.  *
20820 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c  /.  LogEst rScal
20830 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20  e, rSortCost;.  
20840 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
20850 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65  >0 && 66==sqlite
20860 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a  3LogEst(100) );.
20870 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74    rScale = sqlit
20880 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72  e3LogEst((nOrder
20890 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f  By-nSorted)*100/
208a0 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a  nOrderBy) - 66;.
208b0 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52    rSortCost = nR
208c0 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31 36  ow + rScale + 16
208d0 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c 65  ;..  /* Multiple
208e0 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72 65   by log(M) where
208f0 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   M is the number
20900 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e   of output rows.
20910 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c 49  .  ** Use the LI
20920 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74 20  MIT for M if it 
20930 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  is smaller */.  
20940 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
20950 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
20960 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26 26  USE_LIMIT)!=0 &&
20970 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c   pWInfo->iLimit<
20980 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f 77  nRow ){.    nRow
20990 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69   = pWInfo->iLimi
209a0 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43 6f  t;.  }.  rSortCo
209b0 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52 6f  st += estLog(nRo
209c0 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53 6f  w);.  return rSo
209d0 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rtCost;.}../*.**
209e0 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20   Given the list 
209f0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
20a00 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e  ects at pWInfo->
20a10 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75  pLoops, this rou
20a20 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tine.** attempts
20a30 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77   to find the low
20a40 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68  est cost path th
20a50 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57  at visits each W
20a60 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65  hereLoop.** once
20a70 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20  .  This path is 
20a80 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  then loaded into
20a90 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d   the pWInfo->a[]
20aa0 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a  .pWLoop fields..
20ab0 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61  **.** Assume tha
20ac0 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
20ad0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
20ae0 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
20af0 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a   to be sorted.**
20b00 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74   will be nRowEst
20b10 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32   (in the 10*log2
20b20 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
20b30 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f  .  Or, ignore so
20b40 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69  rting.** costs i
20b50 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a  f nRowEst==0..**
20b60 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
20b70 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
20b80 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
20b90 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
20ba0 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
20bb0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
20bc0 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
20bd0 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
20be0 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20  *pWInfo, LogEst 
20bf0 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20  nRowEst){.  int 
20c00 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20  mxChoice;       
20c10 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
20c20 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
20c30 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72  taneous paths tr
20c40 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  acked */.  int n
20c50 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
20c60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20c70 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a  f terms in the j
20c80 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  oin */.  Parse *
20c90 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
20ca0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20cb0 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
20cc0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
20cd0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
20ce0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
20cf0 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20d10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f  * Loop counter o
20d20 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  ver the terms of
20d30 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69   the join */.  i
20d40 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20  nt ii, jj;      
20d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20d60 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
20d70 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20  nt mxI = 0;     
20d80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
20d90 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20  x of next entry 
20da0 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20  to replace */.  
20db0 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
20dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20dd0 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
20de0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
20df0 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20    LogEst mxCost 
20e00 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
20e10 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61  aximum cost of a
20e20 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f   set of paths */
20e30 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f  .  LogEst mxUnso
20e40 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  rted = 0;    /* 
20e50 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64  Maximum unsorted
20e60 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f   cost of a set o
20e70 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  f path */.  int 
20e80 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20  nTo, nFrom;     
20e90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20ea0 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73  of valid entries
20eb0 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46   in aTo[] and aF
20ec0 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  rom[] */.  Where
20ed0 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20  Path *aFrom;    
20ee0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f       /* All nFro
20ef0 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20 70  m paths at the p
20f00 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f  revious level */
20f10 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 54  .  WherePath *aT
20f20 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
20f30 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74  The nTo best pat
20f40 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  hs at the curren
20f50 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65  t level */.  Whe
20f60 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20  rePath *pFrom;  
20f70 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
20f80 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20  ment of aFrom[] 
20f90 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b  that we are work
20fa0 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ing on */.  Wher
20fb0 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20  ePath *pTo;     
20fc0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
20fd0 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61  ent of aTo[] tha
20fe0 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  t we are working
20ff0 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   on */.  WhereLo
21000 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20  op *pWLoop;     
21010 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
21020 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
21030 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  ts */.  WhereLoo
21040 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20  p **pX;         
21050 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76    /* Used to div
21060 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65 20  y up the pSpace 
21070 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45  memory */.  LogE
21080 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20  st *aSortCost = 
21090 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67  0;    /* Sorting
210a0 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72   and partial sor
210b0 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20  ting costs */.  
210c0 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20  char *pSpace;   
210d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
210e0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73  porary memory us
210f0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
21100 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  ne */.  int nSpa
21110 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
21120 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
21130 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  ace allocated at
21140 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50   pSpace */..  pP
21150 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
21160 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
21170 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f  arse->db;.  nLoo
21180 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  p = pWInfo->nLev
21190 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  el;.  /* TUNING:
211a0 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72   For simple quer
211b0 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65  ies, only the be
211c0 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63 6b  st path is track
211d0 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77  ed..  ** For 2-w
211e0 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20  ay joins, the 5 
211f0 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20 66  best paths are f
21200 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f  ollowed..  ** Fo
21210 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20  r joins of 3 or 
21220 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61  more tables, tra
21230 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20 70  ck the 10 best p
21240 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69  aths */.  mxChoi
21250 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20  ce = (nLoop<=1) 
21260 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20  ? 1 : (nLoop==2 
21270 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73  ? 5 : 10);.  ass
21280 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e  ert( nLoop<=pWIn
21290 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
212a0 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41  rc );.  WHERETRA
212b0 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d  CE(0x002, ("----
212c0 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20   begin solver.  
212d0 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c  (nRowEst=%d)\n",
212e0 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f   nRowEst));..  /
212f0 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20  * If nRowEst is 
21300 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69  zero and there i
21310 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
21320 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e  ause, ignore it.
21330 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   In this.  ** ca
21340 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  se the purpose o
21350 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74  f this call is t
21360 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
21370 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65  umber of rows re
21380 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74  turned.  ** by t
21390 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79  he overall query
213a0 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69  . Once this esti
213b0 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62  mate has been ob
213c0 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  tained, the call
213d0 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76  er.  ** will inv
213e0 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
213f0 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c  n a second time,
21400 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73 74   passing the est
21410 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a  imate as the.  *
21420 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65  * nRowEst parame
21430 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ter.  */.  if( p
21440 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d  WInfo->pOrderBy=
21450 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30  =0 || nRowEst==0
21460 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79   ){.    nOrderBy
21470 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
21480 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57     nOrderBy = pW
21490 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
214a0 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nExpr;.  }..  /*
214b0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
214c0 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66  itialize space f
214d0 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e  or aTo, aFrom an
214e0 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f  d aSortCost[] */
214f0 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a  .  nSpace = (siz
21500 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b 73  eof(WherePath)+s
21510 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
21520 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63  )*nLoop)*mxChoic
21530 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d  e*2;.  nSpace +=
21540 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
21550 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53  * nOrderBy;.  pS
21560 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62  pace = sqlite3Db
21570 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
21580 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70  nSpace);.  if( p
21590 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
215a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
215b0 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68  KPT;.  aTo = (Wh
215c0 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65 3b  erePath*)pSpace;
215d0 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d  .  aFrom = aTo+m
215e0 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65  xChoice;.  memse
215f0 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(aFrom, 0, size
21600 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20  of(aFrom[0]));. 
21610 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70   pX = (WhereLoop
21620 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69  **)(aFrom+mxChoi
21630 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78  ce);.  for(ii=mx
21640 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d  Choice*2, pFrom=
21650 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c  aTo; ii>0; ii--,
21660 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20   pFrom++, pX += 
21670 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f  nLoop){.    pFro
21680 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20  m->aLoop = pX;. 
21690 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42   }.  if( nOrderB
216a0 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  y ){.    /* If t
216b0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
216c0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69   BY clause and i
216d0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 69  t is not being i
216e0 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a 20  gnored, set up. 
216f0 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20     ** space for 
21700 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  the aSortCost[] 
21710 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65 6d  array. Each elem
21720 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72 74  ent of the aSort
21730 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20 2a  Cost array.    *
21740 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f  * is either zero
21750 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61   - meaning it ha
21760 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 69  s not yet been i
21770 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20  nitialized - or 
21780 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  the.    ** cost 
21790 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45  of sorting nRowE
217a0 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20  st rows of data 
217b0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
217c0 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a  X terms of.    *
217d0 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
217e0 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61 64  lause are alread
217f0 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65 72  y in order, wher
21800 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61 79  e X is the array
21810 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20   .    ** index. 
21820 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f 73   */.    aSortCos
21830 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b  t = (LogEst*)pX;
21840 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f 72  .    memset(aSor
21850 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  tCost, 0, sizeof
21860 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65  (LogEst) * nOrde
21870 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rBy);.  }.  asse
21880 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30  rt( aSortCost==0
21890 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
218a0 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f  ce]==(char*)&aSo
218b0 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d  rtCost[nOrderBy]
218c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 53   );.  assert( aS
218d0 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70  ortCost!=0 || &p
218e0 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28  Space[nSpace]==(
218f0 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f  char*)pX );..  /
21900 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
21910 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
21920 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
21930 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
21940 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
21950 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
21960 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
21970 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
21980 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68 65  bove 28.  If the
21990 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
219a0 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
219b0 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
219c0 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
219d0 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38 0a  in the first 28.
219e0 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
219f0 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
21a00 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
21a10 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
21a20 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
21a30 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38 29  >nQueryLoop, 48)
21a40 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d 73  ;  assert( 48==s
21a50 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38 29  qlite3LogEst(28)
21a60 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b   );.  nFrom = 1;
21a70 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f 6d  .  assert( aFrom
21a80 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30  [0].isOrdered==0
21a90 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72   );.  if( nOrder
21aa0 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
21ab0 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74  nLoop is zero, t
21ac0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
21ad0 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74   FROM terms in t
21ae0 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65 0a  he query. Since.
21af0 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63      ** in this c
21b00 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d 61  ase the query ma
21b10 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d  y return a maxim
21b20 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74  um of one row, t
21b30 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 2a  he results.    *
21b40 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  * are already in
21b50 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6f   the requested o
21b60 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64 65  rder. Set isOrde
21b70 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79 20  red to nOrderBy 
21b80 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61  to.    ** indica
21b90 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66 20  te this. Or, if 
21ba0 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65 72  nLoop is greater
21bb0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20   than zero, set 
21bc0 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20 20  isOrdered to.   
21bd0 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74 69   ** -1, indicati
21be0 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ng that the resu
21bf0 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d 61  lt set may or ma
21c00 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65 64  y not be ordered
21c10 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e 64  , .    ** depend
21c20 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73  ing on the loops
21c30 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 75   added to the cu
21c40 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a  rrent plan.  */.
21c50 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f      aFrom[0].isO
21c60 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30  rdered = nLoop>0
21c70 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79   ? -1 : nOrderBy
21c80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
21c90 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c 79  ute successively
21ca0 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61 74   longer WherePat
21cb0 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72 65  hs using the pre
21cc0 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f 6e  vious generation
21cd0 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50 61  .  ** of WherePa
21ce0 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69 73  ths as the basis
21cf0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20 20   for the next.  
21d00 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
21d10 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20  e mxChoice.  ** 
21d20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65 61  best paths at ea
21d30 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  ch generation */
21d40 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
21d50 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
21d60 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d  op++){.    nTo =
21d70 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   0;.    for(ii=0
21d80 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69  , pFrom=aFrom; i
21d90 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70  i<nFrom; ii++, p
21da0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66  From++){.      f
21db0 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f  or(pWLoop=pWInfo
21dc0 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70  ->pLoops; pWLoop
21dd0 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d  ; pWLoop=pWLoop-
21de0 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
21df0 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74       LogEst nOut
21e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e10 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 76         /* Rows v
21e20 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f 6d  isited by (pFrom
21e30 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
21e40 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74      LogEst rCost
21e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e60 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
21e70 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c   path (pFrom+pWL
21e80 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
21e90 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65 64  LogEst rUnsorted
21ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21eb0 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f    /* Unsorted co
21ec0 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c  st of (pFrom+pWL
21ed0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
21ee0 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  i8 isOrdered = p
21ef0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
21f00 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20 66    /* isOrdered f
21f10 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  or (pFrom+pWLoop
21f20 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74  ) */.        Bit
21f30 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20  mask maskNew;   
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21f50 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76 69  * Mask of src vi
21f60 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f  sited by (..) */
21f70 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
21f80 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20   revMask = 0;   
21f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
21fa0 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72 20  sk of rev-order 
21fb0 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a  loops for (..) *
21fc0 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  /..        if( (
21fd0 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26  pWLoop->prereq &
21fe0 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f   ~pFrom->maskLoo
21ff0 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
22000 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
22010 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20  WLoop->maskSelf 
22020 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f  & pFrom->maskLoo
22030 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  p)!=0 ) continue
22040 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
22050 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
22060 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
22070 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d 3e  X)!=0 && pFrom->
22080 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20 20 20 20  nRow<10 ){.     
22090 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75       /* Do not u
220a0 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  se an automatic 
220b0 69 6e 64 65 78 20 69 66 20 74 68 65 20 74 68 69  index if the thi
220c0 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65 63 74  s loop is expect
220d0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
220e0 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68 61 6e  to run less than
220f0 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a 20 20 20   2 times. */.   
22100 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 31         assert( 1
22110 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
22120 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  (2) );.         
22130 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
22150 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70  At this point, p
22160 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69  WLoop is a candi
22170 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e  date to be the n
22180 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20  ext loop. .     
22190 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74     ** Compute it
221a0 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  s cost */.      
221b0 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71    rUnsorted = sq
221c0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
221d0 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57  WLoop->rSetup,pW
221e0 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72  Loop->rRun + pFr
221f0 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20  om->nRow);.     
22200 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73     rUnsorted = s
22210 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
22220 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d  rUnsorted, pFrom
22230 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20  ->rUnsorted);.  
22240 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72        nOut = pFr
22250 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f  om->nRow + pWLoo
22260 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  p->nOut;.       
22270 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d   maskNew = pFrom
22280 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c  ->maskLoop | pWL
22290 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
222a0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
222b0 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ered<0 ){.      
222c0 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20      isOrdered = 
222d0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
222e0 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f  esOrderBy(pWInfo
222f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22300 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
22310 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
22320 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  , pWInfo->wctrlF
22330 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f               iLo
22350 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76  op, pWLoop, &rev
22360 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  Mask);.        }
22370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22380 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d  revMask = pFrom-
22390 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  >revLoop;.      
223a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
223b0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20  isOrdered>=0 && 
223c0 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72  isOrdered<nOrder
223d0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
223e0 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  if( aSortCost[is
223f0 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20  Ordered]==0 ){. 
22400 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74             aSort
22410 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20  Cost[isOrdered] 
22420 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f  = whereSortingCo
22430 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
22440 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77      pWInfo, nRow
22450 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69  Est, nOrderBy, i
22460 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  sOrdered.       
22470 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
22480 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43    }.          rC
22490 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ost = sqlite3Log
224a0 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64  EstAdd(rUnsorted
224b0 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  , aSortCost[isOr
224c0 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20  dered]);..      
224d0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
224e0 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20  x002,.          
224f0 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20      ("---- sort 
22500 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64  cost=%-3d (%d/%d
22510 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  ) increases cost
22520 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22 2c   %3d to %-3d\n",
22530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22540 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
22550 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79 2d  red], (nOrderBy-
22560 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72 64  isOrdered), nOrd
22570 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
22580 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 2c        rUnsorted,
22590 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20 20   rCost));.      
225a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
225b0 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73 6f     rCost = rUnso
225c0 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rted;.        }.
225d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
225e0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c 6f  k to see if pWLo
225f0 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64 64  op should be add
22600 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
22610 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43 68  .        ** mxCh
22620 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61 72  oice best-so-far
22630 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20 20   paths..        
22640 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 69  **.        ** Fi
22650 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20  rst look for an 
22660 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61 6d  existing path am
22670 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ong best-so-far 
22680 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a 2a  paths.        **
22690 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68 65   that covers the
226a0 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f   same set of loo
226b0 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  ps and has the s
226c0 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20 20  ame isOrdered.  
226d0 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67        ** setting
226e0 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
226f0 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e 0a  path candidate..
22700 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22710 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20 22     ** The term "
22720 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
22730 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
22740 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61 6c  )==0" is equival
22750 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ent.        ** t
22760 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  o (pTo->isOrdere
22770 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72 64  d==(-1))==(isOrd
22780 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f 72  ered==(-1))" for
22790 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20 20   the range.     
227a0 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20 76     ** of legal v
227b0 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64 65  alues for isOrde
227c0 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20 20  red, -1..64..   
227d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
227e0 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54  for(jj=0, pTo=aT
227f0 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c  o; jj<nTo; jj++,
22800 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
22810 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b     if( pTo->mask
22820 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20  Loop==maskNew.  
22830 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
22840 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
22850 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
22860 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
22870 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
22880 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b  se( jj==nTo-1 );
22890 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
228a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
228b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
228c0 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b    if( jj>=nTo ){
228d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
228e0 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  ne of the existi
228f0 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  ng best-so-far p
22900 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20 63  aths match the c
22910 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20 20  andidate. */.   
22920 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
22930 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20 20  mxChoice.       
22940 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d 78      && (rCost>mx
22950 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d 3d  Cost || (rCost==
22960 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f 72  mxCost && rUnsor
22970 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64 29  ted>=mxUnsorted)
22980 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
22990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
229a0 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69 64  e current candid
229b0 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65 72  ate is no better
229c0 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68 65   than any of the
229d0 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20   mxChoice.      
229e0 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20 63        ** paths c
229f0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
22a00 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66 66  best-so-far buff
22a10 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64 0a  er.  So discard.
22a20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
22a30 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61 73  his candidate as
22a40 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f 0a   not viable. */.
22a50 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
22a60 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
22a70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22a80 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
22a90 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
22aa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22ab0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53  e3DebugPrintf("S
22ac0 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
22ad0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
22ae0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22af0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
22b00 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
22b10 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
22b20 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
22b30 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
22b40 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72  red>=0 ? isOrder
22b50 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
22b60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
22b70 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
22b80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22b90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22ba0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
22bb0 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d 65  his points it me
22bc0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 77  ans that the new
22bd0 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 0a   candidate path.
22be0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
22bf0 64 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ds to be added t
22c00 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
22c10 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 20  t-so-far paths. 
22c20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
22c30 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b   nTo<mxChoice ){
22c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
22c50 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a  Increase the siz
22c60 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74  e of the aTo set
22c70 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20   by one */.     
22c80 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b         jj = nTo+
22c90 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
22ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22cb0 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c  /* New path repl
22cc0 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20 77  aces the prior w
22cd0 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75  orst to keep cou
22ce0 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63  nt below mxChoic
22cf0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
22d00 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20   jj = mxI;.     
22d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22d20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b   pTo = &aTo[jj];
22d30 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
22d40 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
22d50 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  4 */.          i
22d60 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
22d70 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
22d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
22d90 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20  ebugPrintf("New 
22da0 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
22db0 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  %3d order=%c\n",
22dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22dd0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
22de0 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
22df0 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
22e00 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
22e10 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
22e20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
22e30 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
22e40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22e60 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
22e70 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 62  eaches here if b
22e80 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 20  est-so-far path 
22e90 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65  pTo=aTo[jj] cove
22ea0 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  rs the.         
22eb0 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66 20   ** same set of 
22ec0 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68  loops and has th
22ed0 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64 20  e sam isOrdered 
22ee0 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a 20  setting as the. 
22ef0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 64           ** cand
22f00 69 64 61 74 65 20 70 61 74 68 2e 20 20 43 68 65  idate path.  Che
22f10 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
22f20 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c   candidate shoul
22f30 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20  d replace.      
22f40 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69 66      ** pTo or if
22f50 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
22f60 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65 64  hould be skipped
22f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22f80 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f  ( pTo->rCost<rCo
22f90 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73  st || (pTo->rCos
22fa0 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f 2d  t==rCost && pTo-
22fb0 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a  >nRow<=nOut) ){.
22fc0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
22fd0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
22fe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22ff0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
23000 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
23010 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23020 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74   "Skip   %s cost
23050 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
23060 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
23070 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
23080 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
23090 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
230a0 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
230b0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
230c0 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
230d0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
230f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23100 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d  ("   vs %s cost=
23110 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25 63  %-3d,%d order=%c
23120 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23130 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
23140 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
23150 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
23160 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20  t, pTo->nRow,.  
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23180 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d  pTo->isOrdered>=
23190 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  0 ? pTo->isOrder
231a0 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20  ed+'0' : '?');. 
231b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
231c0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
231d0 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  /* Discard the c
231e0 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 66 72  andidate path fr
231f0 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69  om further consi
23200 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  deration */.    
23210 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23220 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
23230 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ost );.         
23240 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
23250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23260 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
23270 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31  ->rCost==rCost+1
23280 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
23290 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
232a0 20 68 65 72 65 20 69 66 20 74 68 65 20 63 61 6e   here if the can
232b0 64 69 64 61 74 65 20 70 61 74 68 20 69 73 20 62  didate path is b
232c0 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  etter than the. 
232d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20           ** pTo 
232e0 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20 70  path.  Replace p
232f0 54 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e 64  To with the cand
23300 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66  idate. */.#ifdef
23310 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
23320 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
23330 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
23340 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
23350 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
23360 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23370 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
23380 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73 20       "Update %s 
23390 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
233a0 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
233b0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
233c0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
233d0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
233e0 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
233f0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
23400 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
23410 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
23420 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23430 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23440 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
23450 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
23460 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
23470 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
23480 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
23490 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
234a0 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
234b0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
234c0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
234d0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
234e0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
234f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
23500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
23510 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
23520 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
23530 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
23540 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
23550 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
23560 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
23570 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
23580 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
23590 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
235a0 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
235b0 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b  To->nRow = nOut;
235c0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43  .        pTo->rC
235d0 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20  ost = rCost;.   
235e0 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
235f0 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ted = rUnsorted;
23600 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
23610 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
23620 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
23630 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
23640 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
23650 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
23660 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
23670 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
23680 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
23690 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
236a0 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
236b0 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20      mxI = 0;.   
236c0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
236d0 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
236e0 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
236f0 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77  ed = aTo[0].nRow
23700 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
23710 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
23720 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
23730 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
23740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
23750 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
23760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
23770 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78   (pTo->rCost==mx
23780 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  Cost && pTo->rUn
23790 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65  sorted>mxUnsorte
237a0 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
237b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
237c0 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
237d0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
237e0 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d      mxUnsorted =
237f0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b   pTo->rUnsorted;
23800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
23810 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20  xI = jj;.       
23820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23830 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23840 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
23850 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
23860 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f  ABLED  /* >=2 */
23870 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
23880 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30  WhereTrace & 0x0
23890 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
238a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
238b0 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
238c0 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
238d0 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
238e0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
238f0 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
23900 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23910 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
23920 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
23930 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
23940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
23950 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
23960 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
23970 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
23980 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
23990 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
239a0 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
239b0 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a  ed+'0') : '?');.
239c0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
239d0 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a  >isOrdered>0 ){.
239e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
239f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
23a00 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
23a10 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
23a20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
23a40 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
23a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23a60 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
23a70 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
23a80 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
23a90 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
23aa0 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
23ab0 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
23ac0 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
23ad0 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
23ae0 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
23af0 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
23b00 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
23b10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23b20 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
23b30 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
23b40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23b50 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  ee(db, pSpace);.
23b60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23b70 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
23b80 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
23b90 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
23ba0 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
23bb0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
23bc0 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
23bd0 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
23be0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72  for(ii=1; ii<nFr
23bf0 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  om; ii++){.    i
23c00 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e  f( pFrom->rCost>
23c10 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20  aFrom[ii].rCost 
23c20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d  ) pFrom = &aFrom
23c30 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [ii];.  }.  asse
23c40 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
23c50 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
23c60 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
23c70 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
23c80 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
23c90 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
23ca0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
23cb0 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
23cc0 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
23cd0 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
23ce0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
23cf0 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
23d00 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
23d10 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
23d20 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
23d30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  ;.    pLevel->iT
23d40 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e  abCur = pWInfo->
23d50 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
23d60 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
23d70 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  or;.  }.  if( (p
23d80 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
23d90 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
23da0 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26  ISTINCT)!=0.   &
23db0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
23dc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
23dd0 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20  STINCTBY)==0.   
23de0 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  && pWInfo->eDist
23df0 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
23e00 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20  INCT_NOOP.   && 
23e10 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20  nRowEst.  ){.   
23e20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64   Bitmask notUsed
23e30 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77  ;.    int rc = w
23e40 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
23e50 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
23e60 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e   pWInfo->pDistin
23e70 63 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ctSet, pFrom,.  
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
23e90 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
23ea0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
23eb0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
23ec0 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
23ed0 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
23ee0 70 44 69 73 74 69 6e 63 74 53 65 74 2d 3e 6e 45  pDistinctSet->nE
23ef0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49  xpr ){.      pWI
23f00 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
23f10 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
23f20 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20  ORDERED;.    }. 
23f30 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
23f40 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
23f50 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74   if( pWInfo->wct
23f60 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23f70 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20  DISTINCTBY ){.  
23f80 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69      if( pFrom->i
23f90 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f  sOrdered==pWInfo
23fa0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
23fb0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49  r ){.        pWI
23fc0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
23fd0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
23fe0 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d  ORDERED;.      }
23ff0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24000 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
24010 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
24020 72 65 64 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  red;.      pWInf
24030 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72  o->revMask = pFr
24040 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20  om->revLoop;.   
24050 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
24060 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20  OBSat<=0 ){.    
24070 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
24080 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  at = 0;.        
24090 69 66 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20  if( nLoop>0 ){. 
240a0 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b           Bitmask
240b0 20 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   m;.          in
240c0 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
240d0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
240e0 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
240f0 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
24100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24110 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52          WHERE_OR
24120 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f  DERBY_LIMIT, nLo
24130 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
24140 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29  op[nLoop-1], &m)
24150 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24160 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  rc==pWInfo->pOrd
24170 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
24180 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
24190 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
241a0 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  Loop = 1;.      
241b0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
241c0 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20  vMask = m;.     
241d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
241e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
241f0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
24200 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
24210 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
24220 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
24230 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
24240 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
24250 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20  pr && nLoop>0.  
24260 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
24270 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
24280 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
24290 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
242a0 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
242b0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
242c0 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
242d0 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
242e0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
242f0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76  p[nLoop-1], &rev
24300 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Mask.      );.  
24310 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
24320 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
24330 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65  .      if( nOrde
24340 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r==pWInfo->pOrde
24350 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
24360 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f        pWInfo->so
24370 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rted = 1;.      
24380 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
24390 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  k = revMask;.   
243a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
243b0 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
243c0 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
243d0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
243e0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
243f0 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
24400 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
24410 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
24420 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24430 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
24440 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f  st queries use o
24450 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
24460 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74  le (they are not
24470 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65   joins) and have
24480 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f  .** simple == co
24490 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
244a0 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73  t indexed fields
244b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
244c0 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70  attempts.** to p
244d0 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65  lan those simple
244e0 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63   cases using muc
244f0 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20  h less ceremony 
24500 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65  than the.** gene
24510 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
24520 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74  y planner, and t
24530 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73  hereby yield fas
24540 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ter sqlite3_prep
24550 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66  are().** times f
24560 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
24570 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
24580 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63   non-zero on suc
24590 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75  cess, if this qu
245a0 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ery can be handl
245b0 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f  ed by this.** no
245c0 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c  -frills query pl
245d0 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a  anner.  Return z
245e0 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72  ero if this quer
245f0 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20  y needs the .** 
24600 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
24610 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a  query planner..*
24620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
24630 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65  reShortCut(Where
24640 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
24650 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
24660 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73  nfo *pWInfo;.  s
24670 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24680 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65  em *pItem;.  Whe
24690 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
246a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
246b0 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  m;.  WhereLoop *
246c0 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75  pLoop;.  int iCu
246d0 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  r;.  int j;.  Ta
246e0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
246f0 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49  ex *pIdx;..  pWI
24700 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
24710 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57  pWInfo;.  if( pW
24720 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
24730 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
24740 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e 20 30  LAUSE ) return 0
24750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
24760 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
24770 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
24780 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
24790 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
247a0 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
247b0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
247c0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
247d0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
247e0 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 72 65  isIndexedBy ) re
247f0 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d  turn 0;.  iCur =
24800 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
24810 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
24820 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d  ->sWC;.  pLoop =
24830 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
24840 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
24850 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  s = 0;.  pLoop->
24860 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65  nSkip = 0;.  pTe
24870 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
24880 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  eFindTerm(pWC, i
24890 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
248a0 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69  Q|WO_IS, 0);.  i
248b0 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
248c0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
248d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
248e0 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  IS );.    pLoop-
248f0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
24900 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
24910 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  _IPK|WHERE_ONERO
24920 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c  W;.    pLoop->aL
24930 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
24940 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  .    pLoop->nLTe
24950 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f  rm = 1;.    pLoo
24960 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
24970 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e   1;.    /* TUNIN
24980 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77  G: Cost of a row
24990 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20  id lookup is 10 
249a0 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  */.    pLoop->rR
249b0 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d  un = 33;  /* 33=
249c0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
249d0 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  0) */.  }else{. 
249e0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
249f0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
24a00 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
24a10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 4d  ){.      int opM
24a20 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ask;.      asser
24a30 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  t( pLoop->aLTerm
24a40 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c  Space==pLoop->aL
24a50 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  Term );.      if
24a60 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  ( !IsUniqueIndex
24a70 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c  (pIdx).       ||
24a80 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
24a90 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20  here!=0 .       
24aa0 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  || pIdx->nKeyCol
24ab0 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70  >ArraySize(pLoop
24ac0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a  ->aLTermSpace) .
24ad0 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65        ) continue
24ae0 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d  ;.      opMask =
24af0 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
24b00 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  ll ? (WO_EQ|WO_I
24b10 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20  S) : WO_EQ;.    
24b20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
24b30 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
24b40 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
24b50 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
24b60 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
24b70 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20  , j, 0, opMask, 
24b80 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
24b90 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
24ba0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65 73  eak;.        tes
24bb0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
24bc0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
24bd0 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
24be0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54  ->aLTerm[j] = pT
24bf0 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
24c00 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e     if( j!=pIdx->
24c10 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e  nKeyCol ) contin
24c20 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ue;.      pLoop-
24c30 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
24c40 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
24c50 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e  _ONEROW|WHERE_IN
24c60 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28  DEXED;.      if(
24c70 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e   pIdx->isCoverin
24c80 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c  g || (pItem->col
24c90 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
24ca0 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30  nIndex(pIdx))==0
24cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   ){.        pLoo
24cc0 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
24cd0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
24ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
24cf0 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20  p->nLTerm = j;. 
24d00 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
24d10 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20  ree.nEq = j;.   
24d20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
24d30 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
24d40 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
24d50 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71  : Cost of a uniq
24d60 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ue index lookup 
24d70 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70  is 15 */.      p
24d80 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b  Loop->rRun = 39;
24d90 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33    /* 39==sqlite3
24da0 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20  LogEst(15) */.  
24db0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24dc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
24dd0 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
24de0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
24df0 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57  LogEst)1;.    pW
24e00 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
24e10 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
24e20 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
24e30 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
24e40 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
24e50 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
24e60 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
24e70 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a  iTabCur = iCur;.
24e80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
24e90 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Out = 1;.    if(
24ea0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
24eb0 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
24ec0 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  at =  pWInfo->pO
24ed0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
24ee0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
24ef0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
24f00 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
24f10 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
24f20 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
24f30 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
24f40 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  UE;.    }.#ifdef
24f50 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
24f60 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27    pLoop->cId = '
24f70 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0';.#endif.    r
24f80 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
24f90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
24fa0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
24fb0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
24fc0 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
24fd0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
24fe0 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
24ff0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
25000 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
25010 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
25020 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
25030 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
25040 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
25050 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
25060 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
25070 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
25080 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
25090 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
250a0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
250b0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
250c0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
250d0 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
250e0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
250f0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
25100 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
25110 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
25120 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
25130 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
25140 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
25150 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
25160 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
25170 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
25180 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
25190 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
251a0 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
251b0 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
251c0 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
251d0 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
251e0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
251f0 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
25200 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
25210 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
25220 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
25230 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
25240 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
25250 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
25260 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
25270 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
25280 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
25290 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
252a0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
252b0 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
252c0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
252d0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
252e0 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
252f0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
25300 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
25310 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
25320 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
25330 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
25340 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
25350 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
25360 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
25370 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
25380 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
253b0 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
253c0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
253e0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
253f0 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
25400 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
25410 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
25420 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
25430 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
25440 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
25450 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
25460 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
25470 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
25480 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
25490 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
254a0 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
254b0 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
254c0 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
254d0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
254e0 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
254f0 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
25500 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
25510 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
25520 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
25530 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
25540 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
25550 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
25560 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
25570 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
25580 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
25590 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
255a0 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
255b0 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
255c0 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
255d0 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
255e0 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
255f0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
25600 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
25610 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
25620 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
25630 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
25640 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
25650 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
25660 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
25670 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
25680 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
25690 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
256a0 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
256b0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
256c0 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
256d0 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
256e0 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
256f0 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
25700 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
25710 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
25720 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
25730 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
25740 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
25750 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
25760 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
25770 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
25780 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
25790 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
257a0 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
257b0 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
257c0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
257d0 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
257e0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
257f0 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
25800 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
25810 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
25820 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
25830 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
25840 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
25850 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
25860 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
25870 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
25880 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
25890 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
258a0 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
258b0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
258c0 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
258d0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
258e0 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
258f0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
25900 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
25910 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
25920 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25930 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
25940 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
25950 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
25960 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
25970 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
25980 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
25990 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
259a0 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
259b0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
259c0 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
259d0 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
259e0 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
259f0 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
25a00 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
25a10 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
25a20 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
25a30 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
25a40 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
25a50 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
25a60 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
25a70 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
25a80 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
25a90 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
25aa0 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
25ab0 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
25ac0 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
25ad0 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
25ae0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
25af0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
25b00 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
25b10 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
25b20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
25b30 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
25b40 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
25b50 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
25b60 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
25b70 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
25b80 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
25b90 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
25ba0 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
25bb0 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
25bc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
25bd0 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
25be0 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
25bf0 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
25c00 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70  OCESSING.**.** p
25c10 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
25c20 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
25c30 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20  R BY clause (or 
25c40 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
25c50 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  use.** if the WH
25c60 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
25c70 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c   is set in wctrl
25c80 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45  Flags) of a SELE
25c90 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
25ca0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
25cb0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
25cc0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
25cd0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
25ce0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
25cf0 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
25d00 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
25d10 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
25d20 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
25d30 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61  * The iIdxCur pa
25d40 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63  rameter is the c
25d50 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
25d60 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a  an index.  If .*
25d70 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
25d80 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49 64  AUSE is set, iId
25d90 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
25da0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
25db0 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
25dc0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
25dd0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
25de0 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
25df0 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
25e00 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
25e10 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
25e20 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
25e30 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
25e40 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
25e50 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
25e60 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
25e70 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
25e80 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
25e90 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
25ea0 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
25eb0 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
25ec0 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
25ed0 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
25ee0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
25ef0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
25f00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25f10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
25f20 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
25f30 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
25f40 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a  TabList,      /*
25f50 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
25f60 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
25f70 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
25f80 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
25f90 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  re,           /*
25fa0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
25fb0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
25fc0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
25fd0 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f  * An ORDER BY (o
25fe0 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
25ff0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
26000 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
26010 69 6e 63 74 53 65 74 2c 20 2f 2a 20 54 72 79 20  inctSet, /* Try 
26020 6e 6f 74 20 74 6f 20 6f 75 74 70 75 74 20 74 77  not to output tw
26030 6f 20 72 6f 77 73 20 74 68 61 74 20 64 75 70 6c  o rows that dupl
26040 69 63 61 74 65 20 74 68 65 73 65 20 2a 2f 0a 20  icate these */. 
26050 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
26060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26070 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
26080 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
26090 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41  nt.h */.  int iA
260a0 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20  uxArg           
260b0 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52    /* If WHERE_OR
260c0 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
260d0 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
260e0 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26100 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45   ** If WHERE_USE
26110 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65  _LIMIT, then the
26120 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f   limit amount */
26130 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
26140 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
26150 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
26160 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
26170 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
26180 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261a0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
261b0 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
261c0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
261d0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
261e0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
261f0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
26200 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
26210 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
26220 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
26230 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
26240 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
26250 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
26260 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
26270 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
26280 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
26290 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
262a0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
262b0 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
262c0 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
262d0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
262e0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
262f0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
26300 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
26310 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
26320 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
26330 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
26340 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
26350 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
26360 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
26370 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
26380 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
26390 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
263c0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
263d0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
263e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
263f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
26400 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
26410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26420 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
26430 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
26440 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46  ;         /* OPF
26450 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72  LAG_FORDELETE or
26460 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70   zero, as approp
26470 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65  riate */..  asse
26480 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
26490 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
264a0 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20  MULTIROW)==0 || 
264b0 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c  (.        (wctrl
264c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
264d0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
264e0 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72  0 .     && (wctr
264f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
26500 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
26510 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c  .  ));..  /* Onl
26520 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f  y one of WHERE_O
26530 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57  R_SUBCLAUSE or W
26540 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a  HERE_USE_LIMIT *
26550 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
26560 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26570 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
26580 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
26590 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
265a0 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d  ERE_USE_LIMIT)==
265b0 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  0 );..  /* Varia
265c0 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
265d0 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
265e0 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
265f0 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
26600 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
26610 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
26620 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
26630 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
26640 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
26650 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
26660 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
26670 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
26680 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
26690 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
266a0 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
266b0 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
266c0 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
266d0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
266e0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
266f0 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
26700 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
26710 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
26720 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
26730 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
26740 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
26750 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
26760 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
26770 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
26780 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
26790 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
267a0 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
267b0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
267c0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
267d0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
267e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
267f0 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
26800 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
26810 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
26820 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
26830 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
26840 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
26850 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
26860 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
26870 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
26880 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
26890 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
268a0 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
268b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
268c0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
268d0 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
268e0 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
268f0 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
26900 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
26910 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
26920 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
26930 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  SE flag is set, 
26940 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
26950 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
26960 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
26970 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
26980 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
26990 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
269a0 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
269b0 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
269c0 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
269d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
269e0 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
269f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26a00 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
26a10 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
26a20 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
26a30 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
26a40 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
26a50 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
26a60 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
26a70 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
26a80 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
26a90 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
26aa0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
26ab0 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
26ac0 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
26ad0 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
26ae0 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
26af0 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
26b00 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
26b10 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
26b20 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
26b30 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
26b40 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
26b50 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
26b60 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
26b70 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
26b80 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
26b90 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
26ba0 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
26bb0 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
26bc0 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
26bd0 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
26be0 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
26bf0 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
26c00 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
26c10 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
26c20 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
26c30 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
26c40 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
26c50 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
26c60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
26c70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
26c80 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
26c90 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
26ca0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
26cb0 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
26cc0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
26cd0 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
26ce0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
26cf0 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
26d00 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
26d10 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
26d20 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
26d30 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
26d40 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
26d50 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
26d60 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
26d70 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53 65  nfo->pDistinctSe
26d80 74 20 3d 20 70 44 69 73 74 69 6e 63 74 53 65 74  t = pDistinctSet
26d90 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
26da0 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ak = pWInfo->iCo
26db0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
26dc0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
26dd0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
26de0 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
26df0 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ags;.  pWInfo->i
26e00 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b  Limit = iAuxArg;
26e10 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
26e20 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
26e30 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
26e40 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
26e50 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
26e60 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20  PASS_OFF );  /* 
26e70 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74 73  ONEPASS defaults
26e80 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61   to OFF */.  pMa
26e90 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
26ea0 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
26eb0 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
26ec0 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
26ed0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
26ee0 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
26ef0 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
26f00 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
26f10 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
26f20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
26f30 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
26f40 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
26f50 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
26f60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
26f70 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
26f80 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
26f90 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
26fa0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
26fb0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
26fc0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
26fd0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
26fe0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
26ff0 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
27000 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
27010 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
27020 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74  askSet);.  sqlit
27030 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69  e3WhereClauseIni
27040 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
27050 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
27060 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70 57  e3WhereSplit(&pW
27070 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
27080 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  e, TK_AND);.    
27090 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
270a0 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
270b0 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
270c0 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
270d0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
270e0 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
270f0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
27100 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
27110 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  thru..  */.  for
27120 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70  (ii=0; ii<sWLB.p
27130 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  WC->nTerm; ii++)
27140 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69  {.    if( nTabLi
27150 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
27160 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
27170 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e  tJoin(sWLB.pWC->
27180 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
27190 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
271a0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
271b0 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d   sWLB.pWC->a[ii]
271c0 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e  .pExpr, pWInfo->
271d0 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20  iBreak,.        
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271f0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
27200 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e  LL);.      sWLB.
27210 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61  pWC->a[ii].wtFla
27220 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
27230 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27240 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
27250 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
27260 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
27270 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
27280 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
27290 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72  fo->nOBSat = pOr
272a0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
272b0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
272c0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
272d0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
272e0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
272f0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
27300 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
27310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
27320 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
27330 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
27340 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
27350 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
27360 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74 65    ** The N-th te
27370 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
27380 6c 61 75 73 65 20 69 73 20 61 73 73 69 67 6e 65  lause is assigne
27390 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 31  d a bitmask of 1
273a0 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <<N..  **.  ** T
273b0 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70  he rule of the p
273c0 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
273d0 20 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66   ensures thta if
273e0 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
273f0 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62  k for.  ** a tab
27400 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
27410 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
27420 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
27430 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
27440 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e  f T..  ** Knowin
27450 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  g the bitmask fo
27460 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
27470 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
27480 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20  ft join is.  ** 
27490 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
274a0 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
274b0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
274c0 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
274d0 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
274e0 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
274f0 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
27500 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
27510 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
27520 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
27530 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
27540 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
27550 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
27560 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
27570 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
27580 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
27590 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74  AUSE flag is set
275a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
275b0 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
275c0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
275d0 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
275e0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
275f0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
27600 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
27610 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72  TabFuncArgs(pPar
27620 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  se, &pTabList->a
27630 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  [ii], &pWInfo->s
27640 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  WC);.  }.#ifdef 
27650 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
27660 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
27670 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
27680 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  ){.    Bitmask m
27690 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
276a0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
276b0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
276c0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 61  .iCursor);.    a
276d0 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42 49  ssert( m==MASKBI
276e0 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  T(ii) );.  }.#en
276f0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
27700 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
27710 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a  expressions. */.
27720 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78    sqlite3WhereEx
27730 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69  prAnalyze(pTabLi
27740 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
27750 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
27760 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
27770 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
27780 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  ;..  if( wctrlFl
27790 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
277a0 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
277b0 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52   if( isDistinctR
277c0 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c  edundant(pParse,
277d0 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e   pTabList, &pWIn
277e0 66 6f 2d 3e 73 57 43 2c 20 70 44 69 73 74 69 6e  fo->sWC, pDistin
277f0 63 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ctSet) ){.      
27800 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
27810 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
27820 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
27830 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
27840 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
27850 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
27860 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
27870 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
27880 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
27890 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
278a0 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
278b0 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
278c0 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
278d0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
278e0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
278f0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
27900 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
27910 64 65 72 42 79 20 3d 20 70 44 69 73 74 69 6e 63  derBy = pDistinc
27920 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
27930 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
27940 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
27950 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66  jects */.#if def
27960 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
27970 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73  ENABLED).  if( s
27980 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
27990 20 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20   & 0xffff ){.   
279a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
279b0 6e 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ntf("*** Optimiz
279c0 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63  er Start *** (wc
279d0 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c  trlFlags: 0x%x",
279e0 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
279f0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
27a00 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
27a10 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
27a20 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
27a30 20 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75   limit: %d", iAu
27a40 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xArg);.    }.   
27a50 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
27a60 6e 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a  ntf(")\n");.  }.
27a70 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
27a80 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
27a90 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c  ){ /* Display al
27aa0 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
27ab0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
27ac0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
27ad0 6c 61 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e  lausePrint(sWLB.
27ae0 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
27af0 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ..  if( nTabList
27b00 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
27b10 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
27b20 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
27b30 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
27b40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27b50 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
27b60 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20  rror;.  .#ifdef 
27b70 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
27b80 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
27b90 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20  e3WhereTrace ){ 
27ba0 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c     /* Display al
27bb0 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  l of the WhereLo
27bc0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
27bd0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
27be0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
27bf0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
27c00 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  t char zLabel[] 
27c10 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
27c20 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
27c30 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
27c70 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
27c80 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
27c90 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
27ca0 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
27cb0 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
27cc0 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
27cd0 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
27ce0 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
27cf0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
27d00 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
27d10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
27d20 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
27d30 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
27d40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
27d50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
27d60 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
27d70 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
27d80 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
27d90 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
27da0 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
27db0 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
27dc0 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
27dd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
27de0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
27df0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
27e00 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
27e10 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
27e20 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
27e30 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
27e40 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
27e50 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
27e60 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69  ALLBITS;.  }.  i
27e70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
27e80 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
27e90 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
27ea0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
27eb0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
27ec0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
27ed0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
27ee0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
27ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
27f00 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
27f10 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
27f20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
27f30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
27f40 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  o->nOBSat>0 ){. 
27f50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27f60 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
27f70 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57  Y=%d,0x%llx", pW
27f80 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57  Info->nOBSat, pW
27f90 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
27fa0 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
27fb0 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
27fc0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  nct ){.      cas
27fd0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
27fe0 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
27ff0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
28000 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
28010 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20  T=unique");.    
28020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28030 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
28040 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
28050 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
28060 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
28070 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f  tf("  DISTINCT=o
28080 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
28090 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
280a0 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
280b0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
280c0 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
280d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
280e0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
280f0 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  nordered");.    
28100 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28110 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
28120 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
28130 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  "\n");.    for(i
28140 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e  i=0; ii<pWInfo->
28150 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20  nLevel; ii++){. 
28160 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
28170 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69  int(pWInfo->a[ii
28180 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70  ].pWLoop, sWLB.p
28190 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  WC);.    }.  }.#
281a0 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d  endif.  /* Attem
281b0 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
281c0 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
281d0 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65  that do not effe
281e0 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  ct the result */
281f0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e  .  if( pWInfo->n
28200 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70  Level>=2.   && p
28210 44 69 73 74 69 6e 63 74 53 65 74 21 3d 30 0a 20  DistinctSet!=0. 
28220 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
28230 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
28240 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e  ITE_OmitNoopJoin
28250 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  ).  ){.    Bitma
28260 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c  sk tabUsed = sql
28270 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
28280 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
28290 20 70 44 69 73 74 69 6e 63 74 53 65 74 29 3b 0a   pDistinctSet);.
282a0 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
282b0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74  derBy ){.      t
282c0 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65  abUsed |= sqlite
282d0 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
282e0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
282f0 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
28300 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70    }.    while( p
28310 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
28320 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
28330 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e  erm *pTerm, *pEn
28340 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d  d;.      pLoop =
28350 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66   pWInfo->a[pWInf
28360 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c  o->nLevel-1].pWL
28370 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28  oop;.      if( (
28380 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28390 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
283a0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  .fg.jointype & J
283b0 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
283c0 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
283d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
283e0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
283f0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
28400 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
28410 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
28420 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
28430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
28440 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
28450 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
28460 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
28470 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
28480 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
28490 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
284a0 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
284b0 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
284c0 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
284d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
284e0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
284f0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
28500 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
28510 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
28520 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
28530 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
28540 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
28550 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
28560 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28570 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
28580 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28590 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
285a0 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
285b0 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
285c0 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
285d0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
285e0 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
285f0 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
28600 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
28610 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
28620 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
28630 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
28640 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
28650 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
28660 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
28670 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
28680 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
28690 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
286a0 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
286b0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
286c0 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
286d0 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
286e0 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
286f0 70 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61  priate..  */.  a
28700 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
28710 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
28720 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
28730 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
28740 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
28750 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28760 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
28770 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
28780 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f  wsFlags = pWInfo
28790 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
287a0 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  sFlags;.    int 
287b0 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c 61  bOnerow = (wsFla
287c0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
287d0 57 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 62  W)!=0;.    if( b
287e0 4f 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c 20 28  Onerow.     || (
287f0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28800 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
28810 49 52 4f 57 29 21 3d 30 0a 20 20 20 20 20 20 20  IROW)!=0.       
28820 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61      && 0==(wsFla
28830 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
28840 41 4c 54 41 42 4c 45 29 29 0a 20 20 20 20 29 7b  ALTABLE)).    ){
28850 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
28860 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f  OnePass = bOnero
28870 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47  w ? ONEPASS_SING
28880 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  LE : ONEPASS_MUL
28890 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  TI;.      if( Ha
288a0 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
288b0 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28  >a[0].pTab) && (
288c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
288d0 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
288e0 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
288f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
28900 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a  ASS_MULTIROW ){.
28910 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65            bForde
28920 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f  lete = OPFLAG_FO
28930 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  RDELETE;.       
28940 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66   }.        pWInf
28950 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
28960 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
28970 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f  gs & ~WHERE_IDX_
28980 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ONLY);.      }. 
28990 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
289a0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
289b0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
289c0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
289d0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
289e0 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
289f0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
28a00 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
28a10 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
28a20 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
28a30 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
28a40 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
28a50 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
28a60 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
28a70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
28a80 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
28a90 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
28aa0 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
28ab0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28ac0 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
28ad0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
28ae0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
28af0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
28b00 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
28b10 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
28b20 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
28b30 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
28b40 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
28b50 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
28b60 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
28b70 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
28b80 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
28b90 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
28ba0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
28bb0 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
28bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28bd0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
28be0 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
28bf0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
28c00 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
28c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
28c20 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
28c30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
28c40 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
28c50 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
28c60 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
28c70 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
28c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28c90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
28ca0 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
28cb0 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
28cc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
28cd0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
28ce0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
28cf0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
28d00 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
28d10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28d20 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
28d30 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
28d40 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28d50 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
28d60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
28d70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
28d80 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
28d90 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
28da0 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
28db0 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
28dc0 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
28dd0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
28de0 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d  ss[0] = pTabItem
28df0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
28e00 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   };.      sqlite
28e10 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
28e20 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
28e30 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
28e40 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65   op);.      asse
28e50 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  rt( pTabItem->iC
28e60 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69  ursor==pLevel->i
28e70 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
28e80 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
28e90 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
28ea0 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
28eb0 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
28ec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28ed0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
28ee0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
28ef0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
28f00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
28f10 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
28f20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
28f30 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
28f40 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
28f50 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
28f60 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
28f70 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
28f80 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
28f90 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
28fa0 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
28fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28fc0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
28fd0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
28fe0 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
28ff0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29000 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
29010 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
29020 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
29030 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
29040 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62    if( pLoop->u.b
29050 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
29060 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29070 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
29080 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62   OPFLAG_SEEKEQ|b
29090 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20  Fordelete);.    
290a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
290b0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
290c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
290d0 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65  P5(v, bFordelete
290e0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
290f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29100 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
29110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29120 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
29130 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
29140 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
29150 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29       (const u8*)
29180 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  &pTabItem->colUs
29190 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  ed, P4_INT64);.#
291a0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
291b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
291c0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
291d0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
291e0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
291f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29200 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
29210 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
29220 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
29230 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
29240 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
29250 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b    int iIndexCur;
29260 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
29270 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
29280 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69 73     /* iAuxArg is
29290 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20 74   always set if t
292a0 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  o a positive val
292b0 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73  ue if ONEPASS is
292c0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20   possible */.   
292d0 20 20 20 61 73 73 65 72 74 28 20 69 41 75 78 41     assert( iAuxA
292e0 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f  rg!=0 || (pWInfo
292f0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
29300 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
29310 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  IRED)==0 );.    
29320 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
29330 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61  pTab) && IsPrima
29340 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29 0a  ryKeyIndex(pIx).
29350 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
29360 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
29370 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a 20  _SUBCLAUSE)!=0. 
29380 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29390 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74  /* This is one t
293a0 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74  erm of an OR-opt
293b0 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20  imization using 
293c0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
293d0 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  of a.        ** 
293e0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
293f0 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f  ble.  No need fo
29400 72 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64  r a separate ind
29410 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49  ex */.        iI
29420 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
29430 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20  ->iTabCur;.     
29440 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20     op = 0;.     
29450 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66   }else if( pWInf
29460 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
29470 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
29480 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20      Index *pJ = 
29490 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
294a0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
294b0 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78  iIndexCur = iAux
294c0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Arg;.        ass
294d0 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ert( wctrlFlags 
294e0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
294f0 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20  DESIRED );.     
29500 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
29510 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20  (pJ) && pJ!=pIx 
29520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e  ){.          iIn
29530 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20  dexCur++;.      
29540 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65      pJ = pJ->pNe
29550 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
29560 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
29570 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
29580 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
29590 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65  ePass[1] = iInde
295a0 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xCur;.      }els
295b0 65 20 69 66 28 20 69 41 75 78 41 72 67 20 26 26  e if( iAuxArg &&
295c0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
295d0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
295e0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)!=0 ){.       
295f0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
29600 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f 70  xArg;.        op
29610 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b   = OP_ReopenIdx;
29620 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29630 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
29640 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
29650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29660 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
29670 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
29680 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
29690 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
296a0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
296b0 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
296c0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  r>=0 );.      if
296d0 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( op ){.        
296e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
296f0 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43  3(v, op, iIndexC
29700 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
29710 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
29720 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
29730 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  Info(pParse, pIx
29740 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
29750 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
29760 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
29770 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  T)!=0.         &
29780 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
29790 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
297a0 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b  N_RANGE|WHERE_SK
297b0 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20  IPSCAN))==0.    
297c0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
297d0 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
297e0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
297f0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
29800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
29810 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
29820 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a  FLAG_SEEKEQ); /*
29830 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20   Hint to COMDB2 
29840 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
29850 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
29860 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
29870 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20  zName));.#ifdef 
29880 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
29890 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
298a0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
298b0 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d     u64 colUsed =
298c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
298d0 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20  t ii, jj;.      
298e0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
298f0 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  <pIx->nColumn; i
29900 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
29910 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f    jj = pIx->aiCo
29920 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20  lumn[ii];.      
29930 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29        if( jj<0 )
29940 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
29950 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33         if( jj>63
29960 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20   ) jj = 63;.    
29970 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61          if( (pTa
29980 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  bItem->colUsed &
29990 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30   MASKBIT(jj))==0
299a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
299b0 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
299c0 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69   |= ((u64)1)<<(i
299d0 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b  i<63 ? ii : 63);
299e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
299f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
29a00 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
29a10 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
29a20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c  iIndexCur, 0, 0,
29a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a50 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20   (u8*)&colUsed, 
29a60 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20  P4_INT64);.     
29a70 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
29a80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
29a90 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f  UMN_USED_MASK */
29aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29ab0 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
29ac0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
29ad0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
29ae0 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
29af0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
29b00 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
29b10 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
29b20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
29b30 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
29b40 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
29b50 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
29b60 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
29b70 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
29b80 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
29b90 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
29ba0 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
29bb0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
29bc0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
29bd0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
29be0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
29bf0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
29c00 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
29c10 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ; ii++){.    int
29c20 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
29c30 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20    int wsFlags;. 
29c40 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
29c50 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  nfo->a[ii];.    
29c60 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  wsFlags = pLevel
29c70 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
29c80 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  s;.#ifndef SQLIT
29c90 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
29ca0 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
29cb0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
29cc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
29cd0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
29ce0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
29cf0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
29d00 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
29d10 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
29d20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
29d30 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
29d40 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
29d50 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
29d60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29d70 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
29d80 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
29d90 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78  endif.    addrEx
29da0 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  plain = sqlite3W
29db0 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63  hereExplainOneSc
29dc0 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  an(.        pPar
29dd0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
29de0 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
29df0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
29e00 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  ags.    );.    p
29e10 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20  Level->addrBody 
29e20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
29e30 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
29e40 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69   notReady = sqli
29e50 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c  te3WhereCodeOneL
29e60 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
29e70 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a   ii, notReady);.
29e80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
29e90 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
29ea0 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66  addrCont;.    if
29eb0 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45  ( (wsFlags&WHERE
29ec0 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26  _MULTI_OR)==0 &&
29ed0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
29ee0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
29ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
29f00 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e  ite3WhereAddScan
29f10 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69  Status(v, pTabLi
29f20 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72  st, pLevel, addr
29f30 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a  Explain);.    }.
29f40 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
29f50 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
29f60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
29f70 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  n WHERE-core"));
29f80 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
29f90 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
29fa0 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
29fb0 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
29fc0 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
29fd0 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
29fe0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
29ff0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2a000 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
2a010 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
2a020 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
2a030 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2a040 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
2a050 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
2a060 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
2a070 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
2a080 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
2a090 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2a0a0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
2a0b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2a0c0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2a0d0 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
2a0e0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2a0f0 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
2a100 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2a110 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
2a120 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
2a130 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2a140 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  oop;.  SrcList *
2a150 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2a160 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2a170 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2a180 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
2a190 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
2a1a0 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
2a1b0 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
2a1c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
2a1d0 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2a1e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a1f0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2a200 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
2a210 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
2a220 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61   i--){.    int a
2a230 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ddr;.    pLevel 
2a240 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
2a250 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2a260 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
2a270 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2a280 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2a290 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20  el->addrCont);. 
2a2a0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
2a2b0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
2a2c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a2d0 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp3(v, pLevel-
2a2e0 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
2a2f0 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65   pLevel->p2, pLe
2a300 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  vel->p3);.      
2a310 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2a320 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
2a330 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  5);.      VdbeCo
2a340 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2a350 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2a360 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2a370 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56  P_Next);.      V
2a380 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2a390 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2a3a0 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62  Prev);.      Vdb
2a3b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2a3c0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e  Level->op==OP_VN
2a3d0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ext);.    }.    
2a3e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2a3f0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
2a400 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  LE && pLevel->u.
2a410 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  in.nIn>0 ){.    
2a420 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
2a430 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
2a440 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
2a450 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2a460 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2a470 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Nxt);.      for(
2a480 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  j=pLevel->u.in.n
2a490 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d  In, pIn=&pLevel-
2a4a0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d  >u.in.aInLoop[j-
2a4b0 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
2a4c0 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
2a4d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2a4e0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
2a4f0 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
2a500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a510 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  2(v, pIn->eEndLo
2a520 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c  opOp, pIn->iCur,
2a530 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29   pIn->addrInTop)
2a540 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2a550 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2a560 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2a570 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
2a580 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f  opOp==OP_PrevIfO
2a590 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 56 64  pen);.        Vd
2a5a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
2a5b0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d  pIn->eEndLoopOp=
2a5c0 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b  =OP_NextIfOpen);
2a5d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a5e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2a5f0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
2a600 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a610 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a620 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2a630 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
2a640 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2a650 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a 20 20  ->addrSkip ){.  
2a660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2a670 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
2a680 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2a690 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2a6a0 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61 6e 20  "next skip-scan 
2a6b0 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75  on %s", pLoop->u
2a6c0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
2a6d0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
2a6e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2a6f0 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
2a700 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 73 71  rSkip);.      sq
2a710 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2a720 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e(v, pLevel->add
2a730 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20 7d 0a  rSkip-2);.    }.
2a740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
2a750 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48  IKE_DOESNT_MATCH
2a760 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28 20 70  _BLOBS.    if( p
2a770 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
2a780 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ep ){.      sqli
2a790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2a7a0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
2a7b0 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c 2d 3e  , (int)(pLevel->
2a7c0 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e 31 29  iLikeRepCntr>>1)
2a7d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a7e0 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
2a7f0 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29 3b 0a  ->addrLikeRep);.
2a800 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2a810 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ge(v);.    }.#en
2a820 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c 65 76  dif.    if( pLev
2a830 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
2a840 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
2a850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2a860 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65  v, OP_IfPos, pLe
2a870 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
2a880 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2a890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a8a0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
2a8b0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2a8c0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2a8d0 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  || (pLoop->wsFla
2a8e0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2a8f0 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
2a900 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2a910 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2a920 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
2a930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a940 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2a950 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Row, pTabList->a
2a960 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
2a970 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a980 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2a990 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2a9a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2a9b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2a9c0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
2a9d0 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
2a9e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2a9f0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
2aa00 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
2aa10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2aa20 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
2aa30 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
2aa40 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
2aa50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2aa60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2aa70 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
2aa80 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
2aa90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2aaa0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2aab0 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  addr);.    }.   
2aac0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
2aad0 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
2aae0 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69  E-loop%d: %s", i
2aaf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ab00 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
2ab10 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2ab20 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e  l->iFrom].pTab->
2ab30 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20  zName));.  }..  
2ab40 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
2ab50 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
2ab60 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
2ab70 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
2ab80 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
2ab90 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
2aba0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2abb0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
2abc0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  );..  assert( pW
2abd0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
2abe0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
2abf0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
2ac00 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
2ac10 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
2ac20 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2ac30 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a     int k, last;.
2ac40 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
2ac50 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
2ac60 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
2ac70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2ac80 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
2ac90 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2aca0 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
2acb0 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
2acc0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
2acd0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
2ace0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
2acf0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
2ad00 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75   /* For a co-rou
2ad10 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c  tine, change all
2ad20 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72   OP_Column refer
2ad30 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62  ences to the tab
2ad40 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2ad50 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f   co-routine into
2ad60 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75   OP_Copy of resu
2ad70 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  lt contained in 
2ad80 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  a register..    
2ad90 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f  ** OP_Rowid beco
2ada0 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20  mes OP_Null..   
2adb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
2adc0 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2add0 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e 6d 61  utine && !db->ma
2ade0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2adf0 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
2ae00 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70 4c 65  umnToCopy(v, pLe
2ae10 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70  vel->addrBody, p
2ae20 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a  Level->iTabCur,.
2ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
2ae50 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c  Item->regResult,
2ae60 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69   0);.      conti
2ae70 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
2ae80 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
2ae90 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
2aea0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
2aeb0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2aec0 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  n..    ** Except
2aed0 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65 20 63  , do not close c
2aee0 75 72 73 6f 72 73 20 74 68 61 74 20 77 69 6c 6c  ursors that will
2aef0 20 62 65 20 72 65 75 73 65 64 20 62 79 20 74 68   be reused by th
2af00 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
2af10 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52 45 5f  n.    ** (WHERE_
2af20 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 2e 20 20  OR_SUBCLAUSE).  
2af30 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65  And do not close
2af40 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74   the OP_OpenWrit
2af50 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20 2a 2a  e cursors.    **
2af60 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65   created for the
2af70 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a   ONEPASS optimiz
2af80 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
2af90 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2afa0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2afb0 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  eral)==0.     &&
2afc0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
2afd0 30 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66  0.     && (pWInf
2afe0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2aff0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
2b000 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  SE)==0.    ){.  
2b010 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f      int ws = pLo
2b020 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20  op->wsFlags;.   
2b030 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
2b040 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2b050 5f 4f 46 46 20 26 26 20 28 77 73 20 26 20 57 48  _OFF && (ws & WH
2b060 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2b070 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2b080 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2b090 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
2b0a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2b0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b0c0 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44   (ws & WHERE_IND
2b0d0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
2b0e0 26 26 20 28 77 73 20 26 20 28 57 48 45 52 45 5f  && (ws & (WHERE_
2b0f0 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  IPK|WHERE_AUTO_I
2b100 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20 20 20  NDEX))==0 .     
2b110 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69 49 64    && pLevel->iId
2b120 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e 61 69  xCur!=pWInfo->ai
2b130 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a 20 20  CurOnePass[1].  
2b140 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
2b150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2b160 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
2b170 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
2b180 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2b190 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
2b1a0 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
2b1b0 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f 64 65  , make VDBE code
2b1c0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
2b1d0 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
2b1e0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
2b1f0 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66 72 6f  x instead of fro
2b200 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68 65 72  m the table wher
2b210 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 6e 20  e possible.  In 
2b220 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20 20 2a  some cases.    *
2b230 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * this optimizat
2b240 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74 68 65  ion prevents the
2b250 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76 65 72   table from ever
2b260 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77 68 69   being read, whi
2b270 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20 79 69  ch can.    ** yi
2b280 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63 61 6e  eld a significan
2b290 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  t performance bo
2b2a0 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ost..    ** .   
2b2b0 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65   ** Calls to the
2b2c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
2b2d0 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74  in between sqlit
2b2e0 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64  e3WhereBegin and
2b2f0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  .    ** sqlite3W
2b300 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76  hereEnd will hav
2b310 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74  e created code t
2b320 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
2b330 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
2b340 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
2b350 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74  loop scans all t
2b360 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67  hat code looking
2b370 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20   for opcodes.   
2b380 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e   ** that referen
2b390 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  ce the table and
2b3a0 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69   converts them i
2b3b0 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74  nto opcodes that
2b3c0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
2b3d0 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  e the index..   
2b3e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
2b3f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
2b400 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52  ERE_INDEXED|WHER
2b410 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
2b420 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f       pIdx = pLoo
2b430 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
2b440 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  x;.    }else if(
2b450 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
2b460 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
2b470 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d   ){.      pIdx =
2b480 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
2b490 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dx;.    }.    if
2b4a0 28 20 70 49 64 78 0a 20 20 20 20 20 26 26 20 28  ( pIdx.     && (
2b4b0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2b4c0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c 7c  ==ONEPASS_OFF ||
2b4d0 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d   !HasRowid(pIdx-
2b4e0 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20 20 26  >pTable)).     &
2b4f0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2b500 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  led.    ){.     
2b510 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
2b520 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2b530 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70 4c 65  );.      k = pLe
2b540 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b 0a 20  vel->addrBody;. 
2b550 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
2b560 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 6b  e3VdbeGetOp(v, k
2b570 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 6b  );.      for(; k
2b580 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
2b590 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2b5a0 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
2b5b0 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
2b5c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
2b5d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2b5e0 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
2b5f0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 4f 70       int x = pOp
2b600 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
2b610 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 54  assert( pIdx->pT
2b620 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
2b630 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
2b640 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
2b650 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
2b660 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50   *pPk = sqlite3P
2b670 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2b680 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Tab);.          
2b690 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c    x = pPk->aiCol
2b6a0 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20 20 20  umn[x];.        
2b6b0 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30      assert( x>=0
2b6c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
2b6d0 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71            x = sq
2b6e0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
2b6f0 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20 20 20  ex(pIdx, x);.   
2b700 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d 30 20         if( x>=0 
2b710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2b720 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20 20 20  Op->p2 = x;.    
2b730 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
2b740 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
2b750 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
2b760 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b770 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2b780 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2b790 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20 29 3b  Y)==0 || x>=0 );
2b7a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2b7b0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
2b7c0 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  OP_Rowid ){.    
2b7d0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
2b7e0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
2b7f0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
2b800 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52  opcode = OP_IdxR
2b810 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
2b820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b830 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c  }..  /* Final cl
2b840 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61  eanup.  */.  pPa
2b850 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
2b860 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
2b870 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65  QueryLoop;.  whe
2b880 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
2b890 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
2b8a0 3b 0a 7d 0a                                      ;.}.