/ Hex Artifact Content
Login

Artifact 1d14e18f32231fa7969e718e7b60ef749b0065e2a7e1b6b00883b20732d280f1:


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: 61 73 73 65 72 74 28 20 70 53 63 61 6e 2d 3e 69  assert( pScan->i
1950: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
1960: 71 75 69 76 20 29 3b 0a 20 20 70 57 43 20 3d 20  quiv );.  pWC = 
1970: 70 53 63 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68  pScan->pWC;.  wh
1980: 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c  ile(1){.    iCol
1990: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  umn = pScan->aiC
19a0: 6f 6c 75 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71  olumn[pScan->iEq
19b0: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72  uiv-1];.    iCur
19c0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b   = pScan->aiCur[
19d0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
19e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
19f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a  C!=0 );.    do{.
1a00: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a10: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a20: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a30: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a40: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a50: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a60: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1a80: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1a90: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1aa0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ab0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ac0: 70 61 72 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e  pareSkip(pTerm->
1ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64 78       pScan->pIdx
1b10: 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20  Expr,iCur)==0). 
1b20: 20 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61          && (pSca
1b30: 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20  n->iEquiv<=1 || 
1b40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b50: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
1b60: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
1b70: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b80: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1b90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
1ba0: 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  IV)!=0.         
1bb0: 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75    && pScan->nEqu
1bc0: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63  iv<ArraySize(pSc
1bd0: 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20  an->aiCur).     
1be0: 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 73        && (pX = s
1bf0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c00: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
1c10: 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70  pr->pRight))->op
1c20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1c30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c40: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1c50: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1c60: 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76   j<pScan->nEquiv
1c70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1c80: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1c90: 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69  >aiCur[j]==pX->i
1ca0: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
1cb0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61       && pScan->a
1cc0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e  iColumn[j]==pX->
1cd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1cf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d20: 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  ( j==pScan->nEqu
1d30: 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  iv ){.          
1d40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72      pScan->aiCur
1d50: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
1d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d70: 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  pScan->aiColumn[
1d80: 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  j] = pX->iColumn
1d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1da0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b  pScan->nEquiv++;
1db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1dc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1de0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
1df0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
1e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e10: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
1e20: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
1e30: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
1e40: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
1e50: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
1e60: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
1e70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e80: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
1ea0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1eb0: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
1ec0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
1ed0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
1ef0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f10: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
1f20: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
1f30: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1f80: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
1f90: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1fa0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1fb0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1fc0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
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 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
2000: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2020: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
2030: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2040: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2050: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2070: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
2080: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20d0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
20e0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
20f0: 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  Q|WO_IS))!=0.   
2100: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
2110: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
2120: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
2130: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
2140: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
2150: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72  le==pScan->aiCur
2160: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
2170: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
2180: 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e  =pScan->aiColumn
2190: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
21a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21b0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21d0: 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
21e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2200: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2210: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  pWC = pWC;.     
2220: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
2230: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
2240: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
2250: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2270: 20 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e       pWC = pWC->
2280: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
2290: 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
22a0: 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pWC!=0 );.    i
22b0: 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  f( pScan->iEquiv
22c0: 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  >=pScan->nEquiv 
22d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 57 43  ) break;.    pWC
22e0: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
22f0: 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  C;.    k = 0;.  
2300: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b    pScan->iEquiv+
2310: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
2330: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
2340: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
2350: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2370: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
2380: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
2390: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
23a0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
23b0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
23c0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
23e0: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
23f0: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
2400: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2410: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
2430: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
2440: 2e 20 20 20 4f 72 20 69 66 20 70 49 64 78 21 3d  .   Or if pIdx!=
2450: 30 20 74 68 65 6e 20 58 20 69 73 20 63 6f 6c 75  0 then X is colu
2460: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e  mn iColumn of in
2470: 64 65 78 20 70 49 64 78 2e 20 20 70 49 64 78 0a  dex pIdx.  pIdx.
2480: 2a 2a 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  ** must be one o
2490: 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66  f the indexes of
24a0: 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a   table iCur..**.
24b0: 2a 2a 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  ** The <op> must
24c0: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
24d0: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
24e0: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
24f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
2500: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
2510: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2520: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
2530: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
2540: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
2550: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
2560: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
2570: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
2580: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
2590: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
25a0: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
25b0: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
25c0: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
25d0: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
25e0: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
25f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
2600: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
2610: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
2620: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
2630: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
2640: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
2650: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
2660: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
2670: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
2680: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
2690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
26a0: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
26b0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
26c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
26d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
26e0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26f0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
2700: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2720: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
2730: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
2740: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2750: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
2760: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
2770: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
2780: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
2790: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
27a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
27c0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
27d0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
27e0: 20 2a 2f 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e   */.){.  pScan->
27f0: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
2800: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
2810: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64 78  C;.  pScan->pIdx
2820: 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 63 61  Expr = 0;.  pSca
2830: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
2840: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2850: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 64  e = 0;.  if( pId
2860: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  x ){.    int j =
2870: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43   iColumn;.    iC
2880: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
2890: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
28a0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45  f( iColumn==XN_E
28b0: 58 50 52 20 29 7b 0a 20 20 20 20 20 20 70 53 63  XPR ){.      pSc
28c0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 70  an->pIdxExpr = p
28d0: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
28e0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
28f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2900: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2910: 5b 6a 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [j];.    }else i
2920: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
2930: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2940: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
2950: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
2960: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75   }else if( iColu
2970: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  mn>=0 ){.      p
2980: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70  Scan->idxaff = p
2990: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
29a0: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
29b0: 69 74 79 3b 0a 20 20 20 20 20 20 70 53 63 61 6e  ity;.      pScan
29c0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
29d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
29e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29f0: 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50   iColumn==XN_EXP
2a00: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
2a10: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2a20: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2a30: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2a40: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2a50: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
2a60: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
2a70: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
2a80: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
2a90: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
2aa0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
2ab0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2ac0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2ad0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2ae0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2af0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2b00: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2b10: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2b20: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2b30: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2b40: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 6f 72  of table iCur or
2b50: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 0a 2a   of index pIdx.*
2b60: 2a 20 69 66 20 70 49 64 78 21 3d 30 20 61 6e 64  * if pIdx!=0 and
2b70: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2b80: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
2b90: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
2ba0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20  ed by.** the op 
2bb0: 70 61 72 61 6d 65 74 65 72 2e 20 20 52 65 74 75  parameter.  Retu
2bc0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2bd0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
2be0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21  ..**.** If pIdx!
2c00: 3d 30 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  =0 then it must 
2c10: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  be one of the in
2c20: 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69  dexes of table i
2c30: 43 75 72 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68  Cur.  .** Search
2c40: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2c50: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2c60: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2c70: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2c80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2ca0: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2cb0: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
2cc0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
2cd0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
2ce0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
2cf0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2d00: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
2d10: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2d20: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2d30: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2d40: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2d50: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2d60: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2d70: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2d80: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2d90: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2da0: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2db0: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2dc0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2dd0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2de0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2df0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2e00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2e10: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2e20: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2e30: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2e40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2e50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2e60: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2e70: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2e80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2e90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2eb0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ec0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2ed0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2ee0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2ef0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2f00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2f10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2f20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2f30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2f40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2f50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2f60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2f70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2f80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2f90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2fa0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2fb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2fc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2fd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2fe0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2ff0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
3000: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
3010: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
3020: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
3030: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
3040: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
3050: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
3060: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
3070: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
3080: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3090: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
30a0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
30b0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
30c0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
30d0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
30e0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
30f0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
3100: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3110: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
3120: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
3130: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
3140: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
3150: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
3160: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
3190: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
31a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
31b0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
31c0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
31d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
31e0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
31f0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
3200: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
3210: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
3220: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
3230: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
3240: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
3250: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
3260: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
3270: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
3280: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
3290: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
32a0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
32b0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
32c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
32d0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
32e0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
32f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3300: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
3310: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3320: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3330: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3340: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3350: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3360: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3370: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3380: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3390: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
33c0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
33d0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
33e0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
33f0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
3400: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
3410: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3420: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3430: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3440: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3450: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3460: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3470: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3480: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3490: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
34a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
34b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
34c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
34d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
3500: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
3510: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3540: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3550: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3560: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3580: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3590: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
35a0: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
35d0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
35e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
35f0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
3600: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
3610: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3640: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3650: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3660: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3670: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3680: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3690: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
36a0: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
36b0: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
36c0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
36d0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
36e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
36f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3700: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
3710: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
3720: 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74  Coll && 0==sqlit
3730: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
3740: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
3750: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3760: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
3770: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3780: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
3790: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
37a0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
37b0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  f index pIdx is 
37c0: 4e 4f 54 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74  NOT NULL.*/.stat
37d0: 69 63 20 69 6e 74 20 69 6e 64 65 78 43 6f 6c 75  ic int indexColu
37e0: 6d 6e 4e 6f 74 4e 75 6c 6c 28 49 6e 64 65 78 20  mnNotNull(Index 
37f0: 2a 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29  *pIdx, int iCol)
3800: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
3810: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
3820: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
3830: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
3840: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d  nColumn );.  j =
3850: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
3860: 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d  iCol];.  if( j>=
3870: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3880: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
3890: 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20  ol[j].notNull;. 
38a0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 3d 3d 28 2d   }else if( j==(-
38b0: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
38c0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
38d0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 28 2d 32 29   assert( j==(-2)
38e0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
38f0: 3b 20 20 2f 2a 20 41 73 73 75 6d 65 20 61 6e 20  ;  /* Assume an 
3900: 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73 69  indexed expressi
3910: 6f 6e 20 63 61 6e 20 61 6c 77 61 79 73 20 79 69  on can always yi
3920: 65 6c 64 20 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  eld a NULL */.. 
3930: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3940: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
3950: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
3960: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
3970: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
3980: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
3990: 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
39a0: 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
39b0: 65 64 75 6e 64 61 6e 74 20 69 66 20 61 6e 79 20  edundant if any 
39c0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 63 6f  subset of the co
39d0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
39e0: 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 61 72  DISTINCT list ar
39f0: 65 20 63 6f 6c 6c 65 63 74 69 76 65 6c 79 20 75  e collectively u
3a00: 6e 69 71 75 65 20 61 6e 64 20 69 6e 64 69 76 69  nique and indivi
3a10: 64 75 61 6c 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e  dually non-null.
3a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3a30: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
3a40: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
3a50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3a60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3a70: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
3a80: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
3a90: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
3aa0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
3ab0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3ac0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
3ad0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
3ae0: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
3af0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
3b00: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
3b10: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
3b20: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
3b30: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
3b40: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
3b70: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
3b80: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
3b90: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
3ba0: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
3bb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
3bc0: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
3bd0: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
3be0: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
3bf0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
3c00: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
3c10: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
3c20: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
3c30: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
3c40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
3c50: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
3c60: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
3c70: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3c80: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
3c90: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
3ca0: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
3cb0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
3cc0: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
3cd0: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
3ce0: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
3cf0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
3d00: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
3d10: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
3d20: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
3d30: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
3d40: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
3d50: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
3d60: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
3d70: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3d80: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
3d90: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
3da0: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
3db0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3dc0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3dd0: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
3de0: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
3df0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
3e00: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
3e10: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
3e20: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
3e30: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
3e40: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
3e50: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
3e60: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
3e70: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
3e80: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
3e90: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
3ea0: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
3eb0: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
3ec0: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
3ed0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
3ee0: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
3ef0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
3f00: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
3f10: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
3f20: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
3f30: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
3f40: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
3f50: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
3f60: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
3f70: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
3f80: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
3f90: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
3fa0: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
3fb0: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
3fc0: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
3fd0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
3fe0: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
3ff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
4000: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
4010: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
4020: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
4030: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
4040: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
4050: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
4060: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
4070: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
4080: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
4090: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
40a0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
40b0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
40c0: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
40d0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
40e0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
40f0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
4100: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4110: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 57 68  if( 0==sqlite3Wh
4120: 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
4130: 20 69 42 61 73 65 2c 20 69 2c 20 7e 28 42 69 74   iBase, i, ~(Bit
4140: 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70  mask)0, WO_EQ, p
4150: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
4160: 69 66 28 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  if( findIndexCol
4170: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
4180: 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
4190: 20 69 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   i)<0 ) break;. 
41a0: 20 20 20 20 20 20 20 69 66 28 20 69 6e 64 65 78         if( index
41b0: 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49  ColumnNotNull(pI
41c0: 64 78 2c 20 69 29 3d 3d 30 20 29 20 62 72 65 61  dx, i)==0 ) brea
41d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
41e0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
41f0: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
4200: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
4210: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
4220: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
4230: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
4240: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
4250: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
4260: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4270: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
4280: 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
4290: 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
42a0: 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
42b0: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74  tatic LogEst est
42c0: 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20  Log(LogEst N){. 
42d0: 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20   return N<=10 ? 
42e0: 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 : sqlite3LogEs
42f0: 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a  t(N) - 33;.}../*
4300: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43  .** Convert OP_C
4310: 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f  olumn opcodes to
4320: 20 4f 50 5f 43 6f 70 79 20 69 6e 20 70 72 65 76   OP_Copy in prev
4330: 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
4340: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   code..**.** Thi
4350: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f  s routine runs o
4360: 76 65 72 20 67 65 6e 65 72 61 74 65 64 20 56 44  ver generated VD
4370: 42 45 20 63 6f 64 65 20 61 6e 64 20 74 72 61 6e  BE code and tran
4380: 73 6c 61 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e  slates OP_Column
4390: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f  .** opcodes into
43a0: 20 4f 50 5f 43 6f 70 79 20 77 68 65 6e 20 74 68   OP_Copy when th
43b0: 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67  e table is being
43c0: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 63 6f   accessed via co
43d0: 2d 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 69 6e 73  -routine .** ins
43e0: 74 65 61 64 20 6f 66 20 76 69 61 20 74 61 62 6c  tead of via tabl
43f0: 65 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20  e lookup..**.** 
4400: 49 66 20 74 68 65 20 62 49 6e 63 72 52 6f 77 69  If the bIncrRowi
4410: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
4420: 2c 20 74 68 65 6e 20 61 6e 79 20 4f 50 5f 52 6f  , then any OP_Ro
4430: 77 69 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  wid instructions
4440: 20 6f 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 69 54   on.** cursor iT
4450: 61 62 43 75 72 20 61 72 65 20 74 72 61 6e 73 66  abCur are transf
4460: 6f 72 6d 65 64 20 69 6e 74 6f 20 4f 50 5f 4e 75  ormed into OP_Nu
4470: 6c 6c 2e 20 4f 72 2c 20 69 66 20 62 49 6e 63 72  ll. Or, if bIncr
4480: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
4490: 6f 2c 0a 2a 2a 20 74 68 65 6e 20 65 61 63 68 20  o,.** then each 
44a0: 4f 50 5f 52 6f 77 69 64 20 69 73 20 74 72 61 6e  OP_Rowid is tran
44b0: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 61 6e 20  sformed into an 
44c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 69  instruction to i
44d0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
44e0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
44f0: 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69 73  its output regis
4500: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4510: 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c  oid translateCol
4520: 75 6d 6e 54 6f 43 6f 70 79 28 0a 20 20 50 61 72  umnToCopy(.  Par
4530: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4540: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4550: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ext */.  int iSt
4560: 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  art,         /* 
4570: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 74  Translate from t
4580: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  his opcode to th
4590: 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  e end */.  int i
45a0: 54 61 62 43 75 72 2c 20 20 20 20 20 20 20 20 2f  TabCur,        /
45b0: 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50 5f 52  * OP_Column/OP_R
45c0: 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 73 20  owid references 
45d0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
45e0: 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74 65 72  .  int iRegister
45f0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ,      /* The fi
4600: 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  rst column is in
4610: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4620: 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52 6f 77  /.  int bIncrRow
4630: 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  id      /* If no
4640: 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66 6f 72  n-zero, transfor
4650: 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20 4f 50  m OP_rowid to OP
4660: 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a 29 7b  _AddImm(1) */.){
4670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4680: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64  rse->pVdbe;.  Vd
4690: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
46a0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
46b0: 69 53 74 61 72 74 29 3b 0a 20 20 69 6e 74 20 69  iStart);.  int i
46c0: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
46d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
46e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
46f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
4710: 3b 20 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69  ; iStart<iEnd; i
4720: 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  Start++, pOp++){
4730: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  .    if( pOp->p1
4740: 21 3d 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  !=iTabCur ) cont
4750: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f  inue;.    if( pO
4760: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
4770: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f  lumn ){.      pO
4780: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  p->opcode = OP_C
4790: 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  opy;.      pOp->
47a0: 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69  p1 = pOp->p2 + i
47b0: 52 65 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20  Register;.      
47c0: 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70  pOp->p2 = pOp->p
47d0: 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  3;.      pOp->p3
47e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
47f0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
4800: 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
4810: 20 20 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69     if( bIncrRowi
4820: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
4830: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
4840: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
4850: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4860: 74 68 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f  the OP_Rowid. */
4870: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
4880: 63 6f 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d  code = OP_AddImm
4890: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
48a0: 31 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  1 = pOp->p2;.   
48b0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31       pOp->p2 = 1
48c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
48d0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
48e0: 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20  de = OP_Null;.  
48f0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
4900: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  0;.        pOp->
4910: 70 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  p3 = 0;.      }.
4920: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4930: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
4940: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
4950: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
4960: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
4970: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
4980: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
4990: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
49a0: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
49b0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
49c0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
49d0: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
49e0: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
49f0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
4a00: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
4a10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
4a20: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
4a30: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
4a40: 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63  _ENABLED).static
4a50: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
4a60: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
4a70: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4a80: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4a90: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4aa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4ab0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4ac0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4ae0: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
4af0: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
4b00: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
4b10: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
4b20: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
4b30: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4b40: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
4b50: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
4b60: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
4b70: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
4b80: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
4b90: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4ba0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
4bb0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4bc0: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
4bd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
4be0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
4bf0: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
4c00: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
4c10: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
4c20: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
4c30: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
4c40: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
4c50: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
4c60: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
4c70: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
4c80: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
4c90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
4ca0: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
4cb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4cc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
4cd0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
4ce0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4cf0: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
4d00: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
4d10: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
4d20: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
4d30: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
4d40: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
4d50: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4d60: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
4d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
4d80: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d90: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
4da0: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
4db0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4dc0: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
4dd0: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
4de0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
4df0: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
4e00: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
4e10: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
4e20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e30: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
4e40: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
4e50: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20  timatedCost);.  
4e60: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4e70: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52  tf("  estimatedR
4e80: 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e  ows=%lld\n", p->
4e90: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
4ea0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
4eb0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
4ec0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
4ed0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
4ee0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4ef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4f00: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
4f10: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
4f20: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
4f30: 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
4f40: 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
4f50: 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
4f60: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
4f70: 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
4f80: 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
4f90: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
4fa0: 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
4fb0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
4fc0: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
4fd0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
4fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4ff0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
5000: 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
5010: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5020: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
5030: 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
5040: 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
5050: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
5060: 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
5070: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
5080: 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
5090: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
50a0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
50b0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
50c0: 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
50d0: 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
50e0: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
50f0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
5100: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65  |WO_IS))==0 ) re
5110: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
5120: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
5130: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
5140: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5150: 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  f( pTerm->u.left
5160: 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
5170: 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
5180: 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
5190: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
51a0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
51b0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
51c0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
51d0: 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
51e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74  return 0;.  test
51f0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78  case( pTerm->pEx
5200: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
5210: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
5220: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
5230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
5240: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
5250: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5260: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
5270: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   Index object fo
5280: 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  r an automatic i
5290: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73  ndex.** and to s
52a0: 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c  et up the WhereL
52b0: 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76  evel object pLev
52c0: 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  el so that the c
52d0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
52e0: 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68   makes use of th
52f0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
5300: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
5310: 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d  d constructAutom
5320: 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
5330: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5350: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
5360: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5370: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
5380: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
5390: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
53a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
53b0: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
53c0: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
53d0: 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e   get the next in
53e0: 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  dex */.  Bitmask
53f0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
5400: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
5410: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
5420: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
5430: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
5440: 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  pLevel          
5450: 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64  /* Write new ind
5460: 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ex here */.){.  
5470: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
5480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5490: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
54a0: 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63   in the construc
54b0: 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ted index */.  W
54c0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
54d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
54e0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
54f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5500: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
5510: 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
5520: 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
5530: 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  a[] */.  Index *
5540: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
5550: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
5560: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
5570: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
5580: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55a0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
55b0: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
55c0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
55d0: 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
55e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
55f0: 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
5600: 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
5610: 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
5620: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
5630: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
5640: 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
5650: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  d */.  int addrT
5660: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
5670: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
5680: 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
5690: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
56a0: 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
56b0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
56c0: 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
56d0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
56e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
5700: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5710: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
5730: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
5740: 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
5750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5760: 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
5770: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
5780: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
5790: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
57a0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
57b0: 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
57c0: 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
57d0: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
57e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
57f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
5800: 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20  r *zNotUsed;    
5810: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
5820: 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65  a space on the e
5830: 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20  nd of pIdx */.  
5840: 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
5850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
5860: 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
5870: 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
5880: 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
5890: 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
58a0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
58b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
58c0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
58d0: 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
58e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
58f0: 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
5900: 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20  een issued */.  
5910: 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d  Expr *pPartial =
5920: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
5930: 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70  artial Index Exp
5940: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
5950: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20   iContinue = 0; 
5960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
5970: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78   here to skip ex
5980: 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20  cluded rows */. 
5990: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
59a0: 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
59b0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
59c0: 74 65 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78  term being index
59d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
59e0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20  Counter = 0;    
59f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77      /* Address w
5a00: 68 65 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75  here integer cou
5a10: 6e 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  nter is initiali
5a20: 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zed */.  int reg
5a30: 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
5a40: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
5a50: 20 72 65 67 69 73 74 65 72 73 20 77 68 65 72 65   registers where
5a60: 20 72 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d   record is assem
5a70: 62 6c 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  bled */..  /* Ge
5a80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
5a90: 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72 65  kip over the cre
5aa0: 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61  ation and initia
5ab0: 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  lization of the.
5ac0: 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69    ** transient i
5ad0: 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20  ndex on 2nd and 
5ae0: 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
5af0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
5b00: 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  p. */.  v = pPar
5b10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
5b20: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
5b30: 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
5b40: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
5b50: 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
5b60: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
5b70: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
5b80: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5b90: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5ba0: 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
5bb0: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
5bc0: 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
5bd0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
5be0: 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
5bf0: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
5c00: 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
5c10: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
5c20: 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
5c30: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
5c40: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
5c50: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
5c60: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
5c70: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
5c80: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
5c90: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
5ca0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5cb0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5cc0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a  _FromJoin)    /*
5cd0: 20 70 72 65 72 65 71 20 61 6c 77 61 79 73 20 6e   prereq always n
5ce0: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20  on-zero */.     
5cf0: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52      || pExpr->iR
5d00: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70  ightJoinTable!=p
5d10: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f  Src->iCursor   /
5d20: 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69 67 68  *   for the righ
5d30: 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20  t-hand   */.    
5d40: 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70       || pLoop->p
5d50: 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20 20 20  rereq!=0 );     
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20 61 20  /*   table of a 
5d80: 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20  LEFT JOIN */.   
5d90: 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72   if( pLoop->prer
5da0: 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  eq==0.     && (p
5db0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
5dc0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30  TERM_VIRTUAL)==0
5dd0: 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
5de0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5df0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
5e00: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
5e10: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
5e20: 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e 69 43  (pExpr, pSrc->iC
5e30: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
5e40: 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74  pPartial = sqlit
5e50: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
5e60: 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a  ->db, pPartial,.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
5eb0: 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , 0));.    }.   
5ec0: 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
5ed0: 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
5ee0: 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
5ef0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
5f00: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
5f10: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
5f20: 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
5f30: 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54  l>=BMS ? MASKBIT
5f40: 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49  (BMS-1) : MASKBI
5f50: 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74  T(iCol);.      t
5f60: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
5f70: 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
5f80: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
5f90: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  1 );.      if( !
5fa0: 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20  sentWarning ){. 
5fb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
5fc0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
5fd0: 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20  G_AUTOINDEX,.   
5fe0: 20 20 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61           "automa
5ff0: 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28  tic index on %s(
6000: 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  %s)", pTable->zN
6010: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
6020: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43   pTable->aCol[iC
6030: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol].zName);.    
6040: 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20      sentWarning 
6050: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
6060: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
6070: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
6080: 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65         if( where
6090: 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73  LoopResize(pPars
60a0: 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b  e->db, pLoop, nK
60b0: 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20  eyCol+1) ){.    
60c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
60d0: 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65  uto_index_create
60e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
60f0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
6100: 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70  m[nKeyCol++] = p
6110: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 64  Term;.        id
6120: 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
6130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6140: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  }.  assert( nKey
6150: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70  Col>0 );.  pLoop
6160: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
6170: 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
6180: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70  nKeyCol;.  pLoop
6190: 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
61a0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48  E_COLUMN_EQ | WH
61b0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57  ERE_IDX_ONLY | W
61c0: 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20 20 20  HERE_INDEXED.   
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f 5f 49    | WHERE_AUTO_I
61f0: 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  NDEX;..  /* Coun
6200: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
6210: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
6220: 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
6230: 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
6240: 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
6250: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
6260: 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
6270: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
6280: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
6290: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
62a0: 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
62b0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
62c0: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
62d0: 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
62e0: 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
62f0: 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
6300: 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
6310: 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
6320: 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
6330: 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
6340: 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
6350: 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
6360: 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
6370: 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
6380: 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
6390: 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
63a0: 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
63b0: 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
63c0: 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
63d0: 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
63e0: 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d  ols | MASKBIT(BM
63f0: 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f  S-1));.  mxBitCo
6400: 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54  l = MIN(BMS-1,pT
6410: 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74  able->nCol);.  t
6420: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6430: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
6440: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
6450: 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
6460: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6470: 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
6480: 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
6490: 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
64a0: 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a   nKeyCol++;.  }.
64b0: 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
64c0: 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d  sed & MASKBIT(BM
64d0: 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79  S-1) ){.    nKey
64e0: 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  Col += pTable->n
64f0: 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
6500: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75   }..  /* Constru
6510: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
6520: 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ect to describe 
6530: 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20  this index */.  
6540: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  pIdx = sqlite3Al
6550: 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
6560: 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  t(pParse->db, nK
6570: 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f  eyCol+1, 0, &zNo
6580: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70 49  tUsed);.  if( pI
6590: 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64  dx==0 ) goto end
65a0: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
65b0: 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62  te;.  pLoop->u.b
65c0: 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
65d0: 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d  dx;.  pIdx->zNam
65e0: 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22  e = "auto-index"
65f0: 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
6600: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
6610: 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
6620: 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
6630: 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
6640: 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
6650: 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
6660: 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
6670: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
6680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
6690: 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
66a0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
66b0: 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
66c0: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
66d0: 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
66e0: 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
66f0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
6700: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
6710: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
6720: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
6730: 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
6740: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
6750: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
6760: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
6770: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
6780: 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  sk;.        pIdx
6790: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
67a0: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
67b0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  umn;.        pCo
67c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
67d0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
67e0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
67f0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
6800: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
6810: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c  zColl[n] = pColl
6820: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
6830: 3a 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  : sqlite3StrBINA
6840: 52 59 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  RY;.        n++;
6850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6860: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
6870: 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74  2)n==pLoop->u.bt
6880: 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  ree.nEq );..  /*
6890: 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
68a0: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
68b0: 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
68c0: 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
68d0: 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
68e0: 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
68f0: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
6900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
6910: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
6920: 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49  T(i) ){.      pI
6930: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
6940: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
6950: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c  >azColl[n] = sql
6960: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
6970: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
6980: 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
6990: 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49  colUsed & MASKBI
69a0: 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20  T(BMS-1) ){.    
69b0: 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70  for(i=BMS-1; i<p
69c0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
69d0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
69e0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
69f0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
6a00: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
6a10: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
6a20: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
6a30: 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79   assert( n==nKey
6a40: 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61  Col );.  pIdx->a
6a50: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f  iColumn[n] = XN_
6a60: 52 4f 57 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61  ROWID;.  pIdx->a
6a70: 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74  zColl[n] = sqlit
6a80: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20  e3StrBINARY;..  
6a90: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75  /* Create the au
6aa0: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f  tomatic index */
6ab0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
6ac0: 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b  l->iIdxCur>=0 );
6ad0: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  .  pLevel->iIdxC
6ae0: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
6af0: 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
6b00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
6b10: 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
6b20: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
6b30: 4b 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c  KeyCol+1);.  sql
6b40: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
6b50: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
6b60: 78 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  x);.  VdbeCommen
6b70: 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
6b80: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
6b90: 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
6ba0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6bb0: 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
6bc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6bd0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
6be0: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
6bf0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  C->pWInfo->pTabL
6c00: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
6c10: 46 72 6f 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61  From];.  if( pTa
6c20: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
6c30: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
6c40: 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
6c50: 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
6c60: 3b 0a 20 20 20 20 61 64 64 72 43 6f 75 6e 74 65  ;.    addrCounte
6c70: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
6c80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6c90: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6cb0: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
6cc0: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
6cd0: 20 30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 61 64   0, pTabItem->ad
6ce0: 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
6cf0: 61 64 64 72 54 6f 70 20 3d 20 20 73 71 6c 69 74  addrTop =  sqlit
6d00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6d10: 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59 69 65  OP_Yield, regYie
6d20: 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ld);.    VdbeCov
6d30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
6d40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e  beComment((v, "n
6d50: 65 78 74 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c  ext row of \"%s\
6d60: 22 22 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  "", pTabItem->pT
6d70: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
6d80: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 54 6f  else{.    addrTo
6d90: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
6da0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
6db0: 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
6dc0: 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Cur); VdbeCovera
6dd0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
6de0: 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
6df0: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
6e00: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6e10: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
6e20: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6e30: 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
6e40: 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
6e50: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
6e60: 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
6e70: 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
6e80: 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
6e90: 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
6ea0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6eb0: 29 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20 73  );.  regBase = s
6ec0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
6ed0: 64 65 78 4b 65 79 28 0a 20 20 20 20 20 20 70 50  dexKey(.      pP
6ee0: 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
6ef0: 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
6f00: 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c  Record, 0, 0, 0,
6f10: 20 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65   0.  );.  sqlite
6f20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6f30: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
6f40: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
6f50: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
6f60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6f70: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
6f80: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20  KRESULT);.  if( 
6f90: 70 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74  pPartial ) sqlit
6fa0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6fb0: 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
6fc0: 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74 65 6d  ;.  if( pTabItem
6fd0: 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
6fe0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
6ff0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
7000: 61 64 64 72 43 6f 75 6e 74 65 72 2c 20 72 65 67  addrCounter, reg
7010: 42 61 73 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73  Base+n);.    tes
7020: 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
7030: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7040: 29 3b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65  );.    translate
7050: 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61  ColumnToCopy(pPa
7060: 72 73 65 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c  rse, addrTop, pL
7070: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20  evel->iTabCur,. 
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
70a0: 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29  m->regResult, 1)
70b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
70c0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
70d0: 29 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d  );.    pTabItem-
70e0: 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
70f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7110: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
7120: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
7130: 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
7140: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7150: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
7160: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
7170: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
7180: 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
7190: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
71a0: 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
71b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
71c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
71d0: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
71e0: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
71f0: 50 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20  Parse);.  .  /* 
7200: 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
7210: 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
7220: 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
7230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7240: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
7250: 3b 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  ;..end_auto_inde
7260: 78 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69  x_create:.  sqli
7270: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
7280: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
7290: 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  al);.}.#endif /*
72a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
72b0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
72c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
72d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
72e0: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
72f0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
7300: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7310: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
7320: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
7330: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
7340: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
7350: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
7360: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
7370: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
7380: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
7390: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
73a0: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
73b0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
73c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
73d0: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
73e0: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
73f0: 50 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c  Parse,.  WhereCl
7400: 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74  ause *pWC,.  Bit
7410: 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20  mask mUnusable, 
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7430: 49 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74  Ignore terms wit
7440: 68 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20  h these prereqs 
7450: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7460: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
7470: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
7480: 65 72 42 79 2c 0a 20 20 75 31 36 20 2a 70 6d 4e  erBy,.  u16 *pmN
7490: 6f 4f 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  oOmit           
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
74b0: 6f 66 20 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20  of terms not to 
74c0: 6f 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  omit */.){.  int
74d0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
74e0: 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
74f0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7500: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
7510: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7520: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
7530: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
7540: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7550: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
7560: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
7570: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
7580: 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
7590: 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
75a0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
75b0: 6f 3b 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  o;.  u16 mNoOmit
75c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e   = 0;..  /* Coun
75d0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
75e0: 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63  possible WHERE c
75f0: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
7600: 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a  s referring.  **
7610: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
7620: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
7630: 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
7640: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
7650: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
7660: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
7670: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7680: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7690: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
76a0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
76b0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
76c0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
76d0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
76e0: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
76f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7700: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7710: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7720: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7730: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7740: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7750: 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
7760: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7770: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7780: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
7790: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
77a0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
77b0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
77c0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
77d0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
77e0: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
77f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7800: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7810: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7820: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7830: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7840: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7850: 28 2d 31 29 20 29 3b 0a 20 20 20 20 6e 54 65 72  (-1) );.    nTer
7860: 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  m++;.  }..  /* I
7870: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
7880: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
7890: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
78a0: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a  he current .  **
78b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
78c0: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  hen allocate spa
78d0: 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65  ce for the aOrde
78e0: 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a  rBy part of.  **
78f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
7900: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7910: 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72  e..  */.  nOrder
7920: 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f  By = 0;.  if( pO
7930: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
7940: 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  t n = pOrderBy->
7950: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
7960: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
7970: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7980: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7990: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
79a0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
79b0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
79c0: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
79d0: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
79e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
79f0: 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64  ==n){.      nOrd
7a00: 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  erBy = n;.    }.
7a10: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
7a20: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
7a30: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
7a40: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
7a50: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7a60: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
7a70: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
7a80: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
7ab0: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
7ac0: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
7af0: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
7b00: 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
7b10: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
7b20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7b30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7b40: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
7b50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7b60: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
7b70: 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
7b80: 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
7b90: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
7ba0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
7bb0: 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
7bc0: 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
7bd0: 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
7be0: 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
7bf0: 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
7c00: 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
7c10: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
7c20: 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
7c30: 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
7c40: 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
7c50: 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
7c60: 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
7c70: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7c80: 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
7c90: 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
7ca0: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
7cb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
7cc0: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
7cd0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
7ce0: 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
7cf0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
7d00: 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
7d10: 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
7d20: 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
7d30: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
7d40: 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
7d50: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
7d60: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
7d70: 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
7d80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7d90: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
7da0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
7db0: 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
7dc0: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7dd0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
7de0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
7df0: 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
7e00: 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
7e10: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
7e20: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
7e30: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
7e40: 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
7ea0: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
7eb0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
7ec0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
7ed0: 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20  {.    u8 op;.   
7ee0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
7ef0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
7f00: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
7f10: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
7f20: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
7f30: 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e   mUnusable ) con
7f40: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
7f50: 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28  t( IsPowerOfTwo(
7f60: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7f70: 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b   & ~WO_EQUIV) );
7f80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7f90: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7fa0: 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  & WO_IN );.    t
7fb0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7fc0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7fd0: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7fe0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7ff0: 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
8000: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8010: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
8020: 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20  r & WO_ALL );.  
8030: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
8040: 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49  perator & ~(WO_I
8050: 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57  SNULL|WO_EQUIV|W
8060: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74  O_IS))==0 ) cont
8070: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
8080: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8090: 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
80a0: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
80b0: 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  ( pTerm->u.leftC
80c0: 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20  olumn>=(-1) );. 
80d0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
80e0: 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
80f0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
8100: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
8110: 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
8120: 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72     op = (u8)pTer
8130: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8140: 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
8150: 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
8160: 57 4f 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 6f  WO_EQ;.    if( o
8170: 70 3d 3d 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20  p==WO_MATCH ){. 
8180: 20 20 20 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d       op = pTerm-
8190: 3e 65 4d 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d  >eMatchOp;.    }
81a0: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
81b0: 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a  .op = op;.    /*
81c0: 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
81d0: 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
81e0: 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
81f0: 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
8200: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
8210: 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
8220: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8230: 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
8240: 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
8250: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
8260: 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
8270: 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
8280: 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
8290: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
82a0: 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
82b0: 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
82c0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
82d0: 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
82e0: 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
82f0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8300: 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
8310: 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
8320: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
8330: 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
8340: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
8350: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8360: 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
8370: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
8380: 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
8390: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
83a0: 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
83b0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
83c0: 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51  r & (WO_IN|WO_EQ
83d0: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
83e0: 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
83f0: 48 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6f  H) );..    if( o
8400: 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  p & (WO_LT|WO_LE
8410: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20  |WO_GT|WO_GE).  
8420: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
8430: 72 49 73 56 65 63 74 6f 72 28 70 54 65 72 6d 2d  rIsVector(pTerm-
8440: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20  >pExpr->pRight) 
8450: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
8460: 28 20 69 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74  ( i<16 ) mNoOmit
8470: 20 7c 3d 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20   |= (1 << i);.  
8480: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c      if( op==WO_L
8490: 54 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e  T ) pIdxCons[j].
84a0: 6f 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20  op = WO_LE;.    
84b0: 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 47 54 20    if( op==WO_GT 
84c0: 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70  ) pIdxCons[j].op
84d0: 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a   = WO_GE;.    }.
84e0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
84f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
8500: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
8510: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
8520: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
8530: 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
8540: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
8550: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
8560: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
8570: 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
8580: 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
8590: 65 72 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f  er;.  }..  *pmNo
85a0: 4f 6d 69 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a  Omit = mNoOmit;.
85b0: 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66    return pIdxInf
85c0: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
85d0: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66  table object ref
85e0: 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73  erence passed as
85f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8600: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
8610: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65  ction.** must re
8620: 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61  present a virtua
8630: 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
8640: 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74  nction invokes t
8650: 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a  he xBestIndex().
8660: 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
8670: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
8680: 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
8690: 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63  index_info objec
86a0: 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20  t that.** comes 
86b0: 69 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72  in as the 3rd ar
86c0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
86d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
86e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
86f0: 73 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70  s, pParse is pop
8700: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65  ulated with an e
8710: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
8720: 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76   a.** non-zero v
8730: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
8740: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
8750: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
8760: 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72  he output.** par
8770: 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  t of the sqlite3
8780: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
8790: 63 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f  cture is left po
87a0: 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57  pulated..**.** W
87b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
87c0: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
87d0: 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ed, it is the re
87e0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
87f0: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
8800: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
8810: 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d   p->idxStr if p-
8820: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
8830: 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74  r indicates.** t
8840: 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75  hat this is requ
8850: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
8860: 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65  int vtabBestInde
8870: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
8880: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71   Table *pTab, sq
8890: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
88a0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
88b0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
88c0: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
88d0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
88e0: 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  ->pVtab;.  int r
88f0: 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  c;..  TRACE_IDX_
8900: 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
8910: 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
8920: 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
8930: 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
8940: 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
8950: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8960: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
8970: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
8980: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8990: 33 4f 6f 6d 46 61 75 6c 74 28 70 50 61 72 73 65  3OomFault(pParse
89a0: 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ->db);.    }else
89b0: 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
89c0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
89d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
89e0: 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
89f0: 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
8a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8a20: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
8a30: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
8a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8a50: 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
8a60: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
8a70: 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
8a80: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 54 68 69 73  .#if 0.  /* This
8a90: 20 65 72 72 6f 72 20 69 73 20 6e 6f 77 20 63 61   error is now ca
8aa0: 75 67 68 74 20 62 79 20 74 68 65 20 63 61 6c 6c  ught by the call
8ab0: 65 72 2e 0a 20 20 2a 2a 20 53 65 61 72 63 68 20  er..  ** Search 
8ac0: 66 6f 72 20 22 78 42 65 73 74 49 6e 64 65 78 20  for "xBestIndex 
8ad0: 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 20 62 65 6c  malfunction" bel
8ae0: 6f 77 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ow */.  for(i=0;
8af0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
8b00: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
8b10: 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
8b20: 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
8b30: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
8b40: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
8b50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8b60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8b70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
8b80: 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
8b90: 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
8ba0: 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
8bb0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
8bc0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
8bd0: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
8be0: 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Err;.}.#endif /*
8bf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8c00: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8c10: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
8c20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8c30: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
8c40: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
8c50: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
8c60: 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
8c70: 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
8c80: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
8c90: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
8ca0: 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
8cb0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
8cc0: 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
8cd0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
8ce0: 73 73 20 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20  ss than pRec.** 
8cf0: 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
8d00: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8d10: 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 52  rows equal to pR
8d20: 65 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ec.**.** Return 
8d30: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
8d40: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
8d50: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d  the smallest sam
8d60: 70 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20 67  ple that.** is g
8d70: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
8d80: 71 75 61 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f  qual to pRec. No
8d90: 74 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64  te that this ind
8da0: 65 78 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64  ex is not an ind
8db0: 65 78 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61  ex.** into the a
8dc0: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d  Sample[] array -
8dd0: 20 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20   it is an index 
8de0: 69 6e 74 6f 20 61 20 76 69 72 74 75 61 6c 20 73  into a virtual s
8df0: 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a  et of samples.**
8e00: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
8e10: 6e 74 65 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c  ntents of aSampl
8e20: 65 5b 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  e[] and the numb
8e30: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
8e40: 72 65 63 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e  record .** pRec.
8e50: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
8e60: 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 0a 20  whereKeyStats(. 
8e70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e90: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
8ea0: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
8eb0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
8ec0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
8ed0: 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
8ee0: 20 6f 66 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65   of */.  Unpacke
8ef0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 2c 20 20  dRecord *pRec,  
8f00: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f       /* Vector o
8f10: 66 20 76 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73  f values to cons
8f20: 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f  ider */.  int ro
8f30: 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20  undUp,          
8f40: 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75        /* Round u
8f50: 70 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e  p if true.  Roun
8f60: 64 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20  d down if false 
8f70: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53  */.  tRowcnt *aS
8f80: 74 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tat             
8f90: 20 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77   /* OUT: stats w
8fa0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
8fb0: 7b 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20  {.  IndexSample 
8fc0: 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d  *aSample = pIdx-
8fd0: 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  >aSample;.  int 
8fe0: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
8ff0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9000: 20 6f 66 20 72 65 71 75 69 72 65 64 20 73 74 61   of required sta
9010: 74 73 20 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63  ts in anEq[] etc
9020: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  . */.  int i;   
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
9050: 69 72 73 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70  irst sample >= p
9060: 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61  Rec */.  int iSa
9070: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
9080: 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74       /* Smallest
9090: 20 73 61 6d 70 6c 65 20 6c 61 72 67 65 72 20 74   sample larger t
90a0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
90b0: 70 52 65 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  pRec */.  int iM
90c0: 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  in = 0;         
90d0: 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73        /* Smalles
90e0: 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74  t sample not yet
90f0: 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
9100: 20 69 54 65 73 74 3b 20 20 20 20 20 20 20 20 20   iTest;         
9110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
9120: 20 73 61 6d 70 6c 65 20 74 6f 20 74 65 73 74 20   sample to test 
9130: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f   /* Result of co
9160: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
9170: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65  on */.  int nFie
9180: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
9190: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
91a0: 20 66 69 65 6c 64 73 20 69 6e 20 70 52 65 63 20   fields in pRec 
91b0: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f  */.  tRowcnt iLo
91c0: 77 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wer = 0;        
91d0: 20 2f 2a 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45   /* anLt[] + anE
91e0: 71 5b 5d 20 6f 66 20 6c 61 72 67 65 73 74 20 73  q[] of largest s
91f0: 61 6d 70 6c 65 20 70 52 65 63 20 69 73 20 3e 20  ample pRec is > 
9200: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
9210: 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45  TE_DEBUG.  UNUSE
9220: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 50 61  D_PARAMETER( pPa
9230: 72 73 65 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rse );.#endif.  
9240: 61 73 73 65 72 74 28 20 70 52 65 63 21 3d 30 20  assert( pRec!=0 
9250: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
9260: 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a  x->nSample>0 );.
9270: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
9280: 6e 46 69 65 6c 64 3e 30 20 26 26 20 70 52 65 63  nField>0 && pRec
9290: 2d 3e 6e 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e  ->nField<=pIdx->
92a0: 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20  nSampleCol );.. 
92b0: 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 79 20   /* Do a binary 
92c0: 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74  search to find t
92d0: 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
92e0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
92f0: 65 71 75 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52  equal.  ** to pR
9300: 65 63 2e 20 49 66 20 70 52 65 63 20 63 6f 6e 74  ec. If pRec cont
9310: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 69  ains a single fi
9320: 65 6c 64 2c 20 74 68 65 20 73 65 74 20 6f 66 20  eld, the set of 
9330: 73 61 6d 70 6c 65 73 20 74 6f 20 73 65 61 72 63  samples to searc
9340: 68 0a 20 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79  h.  ** is simply
9350: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
9360: 72 72 61 79 2e 20 49 66 20 74 68 65 20 73 61 6d  rray. If the sam
9370: 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b  ples in aSample[
9380: 5d 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20  ] contain more. 
9390: 20 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 66 69 65   ** than one fie
93a0: 6c 64 73 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20  lds, all fields 
93b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
93c0: 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  rst are ignored.
93d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52  .  **.  ** If pR
93e0: 65 63 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  ec contains N fi
93f0: 65 6c 64 73 2c 20 77 68 65 72 65 20 4e 20 69 73  elds, where N is
9400: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20   more than one, 
9410: 74 68 65 6e 20 61 73 20 77 65 6c 6c 20 61 73 20  then as well as 
9420: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73  the.  ** samples
9430: 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74   in aSample[] (t
9440: 72 75 6e 63 61 74 65 64 20 74 6f 20 4e 20 66 69  runcated to N fi
9450: 65 6c 64 73 29 2c 20 74 68 65 20 73 65 61 72 63  elds), the searc
9460: 68 20 61 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20  h also has to.  
9470: 2a 2a 20 63 6f 6e 73 69 64 65 72 20 70 72 65 66  ** consider pref
9480: 69 78 65 73 20 6f 66 20 74 68 6f 73 65 20 73 61  ixes of those sa
9490: 6d 70 6c 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  mples. For examp
94a0: 6c 65 2c 20 69 66 20 74 68 65 20 73 65 74 20 6f  le, if the set o
94b0: 66 20 73 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69  f samples.  ** i
94c0: 6e 20 61 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20  n aSample is:.  
94d0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  **.  **     aSam
94e0: 70 6c 65 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20  ple[0] = (a, 5) 
94f0: 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c  .  **     aSampl
9500: 65 5b 31 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a  e[1] = (a, 10) .
9510: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9520: 5b 32 5d 20 3d 20 28 62 2c 20 35 29 20 0a 20 20  [2] = (b, 5) .  
9530: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 33  **     aSample[3
9540: 5d 20 3d 20 28 63 2c 20 31 30 30 29 20 0a 20 20  ] = (c, 100) .  
9550: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 34  **     aSample[4
9560: 5d 20 3d 20 28 63 2c 20 31 30 35 29 0a 20 20 2a  ] = (c, 105).  *
9570: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
9580: 73 65 61 72 63 68 20 73 70 61 63 65 20 73 68 6f  search space sho
9590: 75 6c 64 20 69 64 65 61 6c 6c 79 20 62 65 20 74  uld ideally be t
95a0: 68 65 20 73 61 6d 70 6c 65 73 20 61 62 6f 76 65  he samples above
95b0: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 75   and the .  ** u
95c0: 6e 69 71 75 65 20 70 72 65 66 69 78 65 73 20 5b  nique prefixes [
95d0: 61 5d 2c 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e  a], [b] and [c].
95e0: 20 42 75 74 20 73 69 6e 63 65 20 74 68 61 74 20   But since that 
95f0: 69 73 20 68 61 72 64 20 74 6f 20 6f 72 67 61 6e  is hard to organ
9600: 69 7a 65 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63  ize, .  ** the c
9610: 6f 64 65 20 61 63 74 75 61 6c 6c 79 20 73 65 61  ode actually sea
9620: 72 63 68 65 73 20 74 68 69 73 20 73 65 74 3a 0a  rches this set:.
9630: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a    **.  **     0:
9640: 20 28 61 29 20 0a 20 20 2a 2a 20 20 20 20 20 31   (a) .  **     1
9650: 3a 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  : (a, 5) .  **  
9660: 20 20 20 32 3a 20 28 61 2c 20 31 30 29 20 0a 20     2: (a, 10) . 
9670: 20 2a 2a 20 20 20 20 20 33 3a 20 28 61 2c 20 31   **     3: (a, 1
9680: 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20  0) .  **     4: 
9690: 28 62 29 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a  (b) .  **     5:
96a0: 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (b, 5) .  **   
96b0: 20 20 36 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20    6: (c) .  **  
96c0: 20 20 20 37 3a 20 28 63 2c 20 31 30 30 29 20 0a     7: (c, 100) .
96d0: 20 20 2a 2a 20 20 20 20 20 38 3a 20 28 63 2c 20    **     8: (c, 
96e0: 31 30 35 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a  105).  **     9:
96f0: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
9700: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 73 61 6d   ** For each sam
9710: 70 6c 65 20 69 6e 20 74 68 65 20 61 53 61 6d 70  ple in the aSamp
9720: 6c 65 5b 5d 20 61 72 72 61 79 2c 20 4e 20 73 61  le[] array, N sa
9730: 6d 70 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  mples are presen
9740: 74 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66  t in the.  ** ef
9750: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 61  fective sample a
9760: 72 72 61 79 2e 20 49 6e 20 74 68 65 20 61 62 6f  rray. In the abo
9770: 76 65 2c 20 73 61 6d 70 6c 65 73 20 30 20 61 6e  ve, samples 0 an
9780: 64 20 31 20 61 72 65 20 62 61 73 65 64 20 6f 6e  d 1 are based on
9790: 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53   .  ** sample aS
97a0: 61 6d 70 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65  ample[0]. Sample
97b0: 73 20 32 20 61 6e 64 20 33 20 6f 6e 20 61 53 61  s 2 and 3 on aSa
97c0: 6d 70 6c 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a  mple[1] etc..  *
97d0: 2a 0a 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61  *.  ** Often, sa
97e0: 6d 70 6c 65 20 69 20 6f 66 20 65 61 63 68 20 62  mple i of each b
97f0: 6c 6f 63 6b 20 6f 66 20 4e 20 65 66 66 65 63 74  lock of N effect
9800: 69 76 65 20 73 61 6d 70 6c 65 73 20 68 61 73 20  ive samples has 
9810: 28 69 2b 31 29 20 66 69 65 6c 64 73 2e 0a 20 20  (i+1) fields..  
9820: 2a 2a 20 45 78 63 65 70 74 2c 20 65 61 63 68 20  ** Except, each 
9830: 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 65 78  sample may be ex
9840: 74 65 6e 64 65 64 20 74 6f 20 65 6e 73 75 72 65  tended to ensure
9850: 20 74 68 61 74 20 69 74 20 69 73 20 67 72 65 61   that it is grea
9860: 74 65 72 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a  ter than or.  **
9870: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 72   equal to the pr
9880: 65 76 69 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e  evious sample in
9890: 20 74 68 65 20 61 72 72 61 79 2e 20 46 6f 72 20   the array. For 
98a0: 65 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20  example, in the 
98b0: 61 62 6f 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d  above, .  ** sam
98c0: 70 6c 65 20 32 20 69 73 20 74 68 65 20 66 69 72  ple 2 is the fir
98d0: 73 74 20 73 61 6d 70 6c 65 20 6f 66 20 61 20 62  st sample of a b
98e0: 6c 6f 63 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65  lock of N sample
98f0: 73 2c 20 73 6f 20 61 74 20 66 69 72 73 74 20 69  s, so at first i
9900: 74 20 0a 20 20 2a 2a 20 61 70 70 65 61 72 73 20  t .  ** appears 
9910: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62  that it should b
9920: 65 20 31 20 66 69 65 6c 64 20 69 6e 20 73 69 7a  e 1 field in siz
9930: 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  e. However, that
9940: 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a   would make it .
9950: 20 20 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61    ** smaller tha
9960: 6e 20 73 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74  n sample 1, so t
9970: 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
9980: 20 77 6f 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e   would not work.
9990: 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 0a 20   As a result, . 
99a0: 20 2a 2a 20 69 74 20 69 73 20 65 78 74 65 6e 64   ** it is extend
99b0: 65 64 20 74 6f 20 74 77 6f 20 66 69 65 6c 64 73  ed to two fields
99c0: 2e 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 73  . The duplicates
99d0: 20 74 68 61 74 20 74 68 69 73 20 63 72 65 61 74   that this creat
99e0: 65 73 20 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20  es do not .  ** 
99f0: 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
9a00: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c  ms..  */.  nFiel
9a10: 64 20 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64  d = pRec->nField
9a20: 3b 0a 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ;.  iCol = 0;.  
9a30: 69 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  iSample = pIdx->
9a40: 6e 53 61 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64  nSample * nField
9a50: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
9a60: 69 53 61 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iSamp;          
9a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9a80: 65 78 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20  ex in aSample[] 
9a90: 6f 66 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  of test sample *
9aa0: 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  /.    int n;    
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9ad0: 20 66 69 65 6c 64 73 20 69 6e 20 74 65 73 74 20   fields in test 
9ae0: 73 61 6d 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  sample */..    i
9af0: 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61  Test = (iMin+iSa
9b00: 6d 70 6c 65 29 2f 32 3b 0a 20 20 20 20 69 53 61  mple)/2;.    iSa
9b10: 6d 70 20 3d 20 69 54 65 73 74 20 2f 20 6e 46 69  mp = iTest / nFi
9b20: 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 69 53 61  eld;.    if( iSa
9b30: 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  mp>0 ){.      /*
9b40: 20 54 68 65 20 70 72 6f 70 6f 73 65 64 20 65 66   The proposed ef
9b50: 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 20 69  fective sample i
9b60: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 73 61  s a prefix of sa
9b70: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 69 53 61  mple aSample[iSa
9b80: 6d 70 5d 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70  mp]..      ** Sp
9b90: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20  ecifically, the 
9ba0: 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
9bb0: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 31 20 2b  of at least (1 +
9bc0: 20 69 54 65 73 74 25 6e 46 69 65 6c 64 29 20 0a   iTest%nField) .
9bd0: 20 20 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 20        ** fields 
9be0: 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
9bf0: 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
9c00: 73 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  s effective samp
9c10: 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  le.  */.      fo
9c20: 72 28 6e 3d 28 69 54 65 73 74 20 25 20 6e 46 69  r(n=(iTest % nFi
9c30: 65 6c 64 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65  eld) + 1; n<nFie
9c40: 6c 64 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; n++){.      
9c50: 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 53    if( aSample[iS
9c60: 61 6d 70 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d  amp-1].anLt[n-1]
9c70: 21 3d 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  !=aSample[iSamp]
9c80: 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65  .anLt[n-1] ) bre
9c90: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
9cb0: 20 69 54 65 73 74 20 2b 20 31 3b 0a 20 20 20 20   iTest + 1;.    
9cc0: 7d 0a 0a 20 20 20 20 70 52 65 63 2d 3e 6e 46 69  }..    pRec->nFi
9cd0: 65 6c 64 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73  eld = n;.    res
9ce0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
9cf0: 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
9d00: 70 6c 65 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53  ple[iSamp].n, aS
9d10: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20  ample[iSamp].p, 
9d20: 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  pRec);.    if( r
9d30: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 4c  es<0 ){.      iL
9d40: 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
9d50: 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
9d60: 2b 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  + aSample[iSamp]
9d70: 2e 61 6e 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anEq[n-1];.    
9d80: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
9d90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9da0: 72 65 73 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65  res==0 && n<nFie
9db0: 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  ld ){.      iLow
9dc0: 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61  er = aSample[iSa
9dd0: 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20  mp].anLt[n-1];. 
9de0: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 65 73       iMin = iTes
9df0: 74 2b 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  t+1;.      res =
9e00: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
9e10: 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
9e20: 69 54 65 73 74 3b 0a 20 20 20 20 20 20 69 43 6f  iTest;.      iCo
9e30: 6c 20 3d 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20  l = n-1;.    }. 
9e40: 20 7d 77 68 69 6c 65 28 20 72 65 73 20 26 26 20   }while( res && 
9e50: 69 4d 69 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a  iMin<iSample );.
9e60: 20 20 69 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20    i = iSample / 
9e70: 6e 46 69 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20  nField;..#ifdef 
9e80: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
9e90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9ea0: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
9eb0: 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
9ec0: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 63   binary search c
9ed0: 6f 64 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ode.  ** above f
9ee0: 6f 75 6e 64 20 74 68 65 20 72 69 67 68 74 20 61  ound the right a
9ef0: 6e 73 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63  nswer. This bloc
9f00: 6b 20 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70  k serves no purp
9f10: 6f 73 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ose other.  ** t
9f20: 68 61 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  han to invoke th
9f30: 65 20 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20  e asserts.  */. 
9f40: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
9f50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
9f60: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d   ){.    if( res=
9f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
9f80: 66 20 28 72 65 73 3d 3d 30 29 20 69 73 20 74 72  f (res==0) is tr
9f90: 75 65 2c 20 74 68 65 6e 20 70 52 65 63 20 6d 75  ue, then pRec mu
9fa0: 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73  st be equal to s
9fb0: 61 6d 70 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20  ample i. */.    
9fc0: 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
9fd0: 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
9fe0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
9ff0: 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20  =nField-1 );.   
a000: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
a010: 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  = nField;.      
a020: 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
a030: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
a040: 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  are(aSample[i].n
a050: 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20  , aSample[i].p, 
a060: 70 52 65 63 29 20 0a 20 20 20 20 20 20 20 20 20  pRec) .         
a070: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
a080: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20  >mallocFailed . 
a090: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73       );.    }els
a0a0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65  e{.      /* Unle
a0b0: 73 73 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  ss i==pIdx->nSam
a0c0: 70 6c 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ple, indicating 
a0d0: 74 68 61 74 20 70 52 65 63 20 69 73 20 6c 61 72  that pRec is lar
a0e0: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ger than.      *
a0f0: 2a 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e  * all samples in
a100: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
a110: 72 72 61 79 2c 20 70 52 65 63 20 6d 75 73 74 20  rray, pRec must 
a120: 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
a130: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 28 69 43  the.      ** (iC
a140: 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65 66  ol+1) field pref
a150: 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20  ix of sample i. 
a160: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a170: 28 20 69 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i<=pIdx->nSamp
a180: 6c 65 20 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20  le && i>=0 );.  
a190: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
a1a0: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20   = iCol+1;.     
a1b0: 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78   assert( i==pIdx
a1c0: 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
a1d0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
a1e0: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
a1f0: 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20  e(aSample[i].n, 
a200: 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52  aSample[i].p, pR
a210: 65 63 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20  ec)>0.          
a220: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
a230: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a240: 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d  .      /* if i==
a250: 30 20 61 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74  0 and iCol==0, t
a260: 68 65 6e 20 72 65 63 6f 72 64 20 70 52 65 63 20  hen record pRec 
a270: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
a280: 61 6c 6c 20 73 61 6d 70 6c 65 73 0a 20 20 20 20  all samples.    
a290: 20 20 2a 2a 20 69 6e 20 74 68 65 20 61 53 61 6d    ** in the aSam
a2a0: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68  ple[] array. Oth
a2b0: 65 72 77 69 73 65 2c 20 69 66 20 28 69 43 6f 6c  erwise, if (iCol
a2c0: 3e 30 29 20 74 68 65 6e 20 70 52 65 63 20 6d 75  >0) then pRec mu
a2d0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 67  st.      ** be g
a2e0: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
a2f0: 71 75 61 6c 20 74 6f 20 74 68 65 20 28 69 43 6f  qual to the (iCo
a300: 6c 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  l) field prefix 
a310: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20  of sample i..   
a320: 20 20 20 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20     ** If (i>0), 
a330: 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20 61  then pRec must a
a340: 6c 73 6f 20 62 65 20 67 72 65 61 74 65 72 20 74  lso be greater t
a350: 68 61 6e 20 73 61 6d 70 6c 65 20 28 69 2d 31 29  han sample (i-1)
a360: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
a370: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
a380: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
a390: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61   iCol;.        a
a3a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
a3b0: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
a3c0: 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53  aSample[i].n, aS
a3d0: 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63  ample[i].p, pRec
a3e0: 29 3c 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )<=0.           
a3f0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
a400: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
a410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a420: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
a430: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
a440: 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 20   nField;.       
a450: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a460: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
a470: 65 28 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  e(aSample[i-1].n
a480: 2c 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70  , aSample[i-1].p
a490: 2c 20 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20  , pRec)<0.      
a4a0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
a4b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a4c0: 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
a4d0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
a4e0: 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  * ifdef SQLITE_D
a4f0: 45 42 55 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72  EBUG */..  if( r
a500: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  es==0 ){.    /* 
a510: 52 65 63 6f 72 64 20 70 52 65 63 20 69 73 20 65  Record pRec is e
a520: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
a530: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
a540: 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
a550: 3b 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d  ;.    aStat[0] =
a560: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
a570: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61  [iCol];.    aSta
a580: 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
a590: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
a5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74  }else{.    /* At
a5b0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
a5c0: 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20   (iCol+1) field 
a5d0: 70 72 65 66 69 78 20 6f 66 20 61 53 61 6d 70 6c  prefix of aSampl
a5e0: 65 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73  e[i] is the firs
a5f0: 74 20 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  t .    ** sample
a600: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
a610: 20 74 68 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20   than pRec. Or, 
a620: 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
a630: 70 6c 65 20 74 68 65 6e 20 70 52 65 63 0a 20 20  ple then pRec.  
a640: 20 20 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74    ** is larger t
a650: 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20  han all samples 
a660: 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 2a 2f  in the array. */
a670: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
a680: 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20 20 69  per, iGap;.    i
a690: 66 28 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d  f( i>=pIdx->nSam
a6a0: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 55 70  ple ){.      iUp
a6b0: 70 65 72 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  per = sqlite3Log
a6c0: 45 73 74 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61  EstToInt(pIdx->a
a6d0: 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a  iRowLogEst[0]);.
a6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a6f0: 20 69 55 70 70 65 72 20 3d 20 61 53 61 6d 70 6c   iUpper = aSampl
a700: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a710: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a720: 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
a730: 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
a740: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a750: 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
a760: 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
a770: 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
a780: 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
a790: 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
a7a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
a7b0: 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
a7c0: 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
a7d0: 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
a7e0: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a7f0: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
a800: 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  l];.  }..  /* Re
a810: 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d 3e  store the pRec->
a820: 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65 66  nField value bef
a830: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 20  ore returning.  
a840: 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c  */.  pRec->nFiel
a850: 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65  d = nField;.  re
a860: 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66  turn i;.}.#endif
a870: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
a880: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
a890: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
a8a0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54   is not NULL, pT
a8b0: 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74 68  erm is a term th
a8c0: 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 75  at provides an u
a8d0: 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a  pper or lower.**
a8e0: 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67   bound on a rang
a8f0: 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74 20  e scan. Without 
a900: 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65 72  considering pTer
a910: 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  m, it is estimat
a920: 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ed .** that the 
a930: 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
a940: 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73 20  nNew rows. This 
a950: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a960: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65   the number.** e
a970: 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 76  stimated to be v
a980: 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61 6b  isited after tak
a990: 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20 61  ing pTerm into a
a9a0: 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ccount..**.** If
a9b0: 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69 63   the user explic
a9c0: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
a9d0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
a9e0: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65 72  lue for this ter
a9f0: 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  m,.** then the r
aa00: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
aa10: 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75  he likelihood mu
aa20: 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65 20  ltiplied by the 
aa30: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70  number of.** inp
aa40: 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77 69  ut rows. Otherwi
aa50: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
aa60: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
aa70: 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20  n "IS NOT NULL" 
aa80: 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69  term.** has a li
aa90: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30  kelihood of 0.50
aaa0: 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20  , and any other 
aab0: 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  term a likelihoo
aac0: 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74  d of 0.25..*/.st
aad0: 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72  atic LogEst wher
aae0: 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68 65  eRangeAdjust(Whe
aaf0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c  reTerm *pTerm, L
ab00: 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c  ogEst nNew){.  L
ab10: 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65  ogEst nRet = nNe
ab20: 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  w;.  if( pTerm )
ab30: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
ab40: 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b  >truthProb<=0 ){
ab50: 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20 70  .      nRet += p
ab60: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
ab70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
ab80: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
ab90: 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
aba0: 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d 3d  ){.      nRet -=
abb0: 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73 65   20;        asse
abc0: 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 20==sqlite3L
abd0: 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20 20  ogEst(4) );.    
abe0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
abf0: 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  Ret;.}...#ifdef 
ac00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
ac10: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
ac20: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 66  ** Return the af
ac30: 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69 6e  finity for a sin
ac40: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  gle column of an
ac50: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68 61 72 20   index..*/.char 
ac60: 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75  sqlite3IndexColu
ac70: 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74  mnAffinity(sqlit
ac80: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
ac90: 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  Idx, int iCol){.
aca0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
acb0: 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e  0 && iCol<pIdx->
acc0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28  nColumn );.  if(
acd0: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
ace0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
acf0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
ad00: 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20  tr(db, pIdx)==0 
ad10: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ad20: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20  AFF_BLOB;.  }.  
ad30: 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f  return pIdx->zCo
ad40: 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65  lAff[iCol];.}.#e
ad50: 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51  ndif...#ifdef SQ
ad60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ad70: 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a  3_OR_STAT4./* .*
ad80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ad90: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74  is called to est
ada0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
adb0: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
adc0: 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73   by a.** range-s
add0: 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63  can on a skip-sc
ade0: 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  an index. For ex
adf0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ample:.**.**   C
ae00: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
ae10: 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a  N t1(a, b, c);.*
ae20: 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
ae30: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41  M t1 WHERE a=? A
ae40: 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41  ND c BETWEEN ? A
ae50: 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75  ND ?;.**.** Valu
ae60: 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73  e pLoop->nOut is
ae70: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74   currently set t
ae80: 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
ae90: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
aea0: 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20 73  ** visited for s
aeb0: 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44  canning (a=? AND
aec0: 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63   b=?). This func
aed0: 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61  tion reduces tha
aee0: 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62  t estimate .** b
aef0: 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f  y some factor to
af00: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
af10: 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e   (c BETWEEN ? AN
af20: 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20  D ?) expression 
af30: 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  based.** on the 
af40: 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20 74  stat4 data for t
af50: 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73  he index. this s
af60: 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f  can will be pefo
af70: 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  rmed multiple .*
af80: 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f  * times (once fo
af90: 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d  r each (a,b) com
afa0: 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  bination that ma
afb0: 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65  tches a=?) is de
afc0: 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20  alt with .** by 
afd0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
afe0: 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20 62  * It does this b
aff0: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  y scanning throu
b000: 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d  gh all stat4 sam
b010: 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20  ples, comparing 
b020: 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63  values.** extrac
b030: 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
b040: 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68 20  and pUpper with 
b050: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
b060: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68  g column in each
b070: 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c  .** sample. If L
b080: 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e   and U are the n
b090: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
b0a0: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73   found to be les
b0b0: 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75  s than or.** equ
b0c0: 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73  al to the values
b0d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b0e0: 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
b0f0: 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  r respectively, 
b100: 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  and.** N is the 
b110: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
b120: 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f  samples, the pLo
b130: 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69  op->nOut value i
b140: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73  s adjusted.** as
b150: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
b160: 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20    nOut = nOut * 
b170: 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20  ( min(U - L, 1) 
b180: 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70  / N ).**.** If p
b190: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f  Lower is NULL, o
b1a0: 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  r a value cannot
b1b0: 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72   be extracted fr
b1c0: 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69  om the term, L i
b1d0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f  s.** set to zero
b1e0: 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20 4e  . If pUpper is N
b1f0: 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
b200: 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
b210: 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20  ted from it,.** 
b220: 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a  U is set to N..*
b230: 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  *.** Normally, t
b240: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
b250: 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62  s *pbDone to 1 b
b260: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
b270: 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
b280: 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  no value can be 
b290: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65  extracted from e
b2a0: 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20  ither pLower or 
b2b0: 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74  pUpper (and so t
b2c0: 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f  he.** estimate o
b2d0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b2e0: 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20 72  rows delivered r
b2f0: 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
b300: 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73  ), *pbDone.** is
b310: 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a   left as is..**.
b320: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
b330: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
b340: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
b350: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
b360: 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  se, .** SQLITE_O
b370: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
b380: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
b390: 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
b3a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
b3b0: 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
b3c0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
b3d0: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
b3e0: 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
b3f0: 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
b400: 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
b410: 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
b420: 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
b430: 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
b440: 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
b450: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
b460: 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
b470: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
b480: 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
b490: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e  /* Update the .n
b4a0: 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69  Out value of thi
b4b0: 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
b4c0: 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20  *pbDone         
b4d0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
b4e0: 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  if at least one 
b4f0: 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72  expr. value extr
b500: 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e  acted */.){.  In
b510: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
b520: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
b530: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
b540: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
b550: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b560: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
b570: 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20  t nLower = -1;. 
b580: 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d   int nUpper = p-
b590: 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e  >nSample+1;.  in
b5a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b5b0: 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c  ;.  u8 aff = sql
b5c0: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
b5d0: 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e  ffinity(db, p, n
b5e0: 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Eq);.  CollSeq *
b5f0: 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69  pColl;.  .  sqli
b600: 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20  te3_value *p1 = 
b610: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
b620: 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
b630: 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20  rom pLower */.  
b640: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
b650: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
b660: 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
b670: 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a  ed from pUpper *
b680: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
b690: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20  e *pVal = 0;    
b6a0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74      /* Value ext
b6b0: 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f  racted from reco
b6c0: 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d  rd */..  pColl =
b6d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
b6e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
b6f0: 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20  >azColl[nEq]);. 
b700: 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
b710: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b720: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b730: 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  r(pParse, pLower
b740: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b750: 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20   aff, &p1);.    
b760: 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  nLower = 0;.  }.
b770: 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20    if( pUpper && 
b780: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b790: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b7a0: 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45  3Stat4ValueFromE
b7b0: 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70  xpr(pParse, pUpp
b7c0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
b7d0: 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20  t, aff, &p2);.  
b7e0: 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20    nUpper = p2 ? 
b7f0: 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a  0 : p->nSample;.
b800: 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c    }..  if( p1 ||
b810: 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   p2 ){.    int i
b820: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b  ;.    int nDiff;
b830: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
b840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
b850: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  <p->nSample; i++
b860: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b870: 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e  lite3Stat4Column
b880: 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  (db, p->aSample[
b890: 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  i].p, p->aSample
b8a0: 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61  [i].n, nEq, &pVa
b8b0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
b8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
b8d0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  1 ){.        int
b8e0: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65   res = sqlite3Me
b8f0: 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61  mCompare(p1, pVa
b900: 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, pColl);.     
b910: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
b920: 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20  nLower++;.      
b930: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
b940: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20  SQLITE_OK && p2 
b950: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b960: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b970: 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c  ompare(p2, pVal,
b980: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b990: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55   if( res>=0 ) nU
b9a0: 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pper++;.      }.
b9b0: 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20      }.    nDiff 
b9c0: 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77  = (nUpper - nLow
b9d0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  er);.    if( nDi
b9e0: 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20  ff<=0 ) nDiff = 
b9f0: 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  1;..    /* If th
ba00: 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
ba10: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62  pper and lower b
ba20: 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20  ound specified, 
ba30: 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
ba40: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69  comparisons indi
ba50: 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61  cate that they a
ba60: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
ba70: 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62  r, use the fallb
ba80: 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  ack.    ** metho
ba90: 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74  d (assume that t
baa0: 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31  he scan visits 1
bab0: 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29  /64 of the rows)
bac0: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
bad0: 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65      ** the numbe
bae0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
baf0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73  d. Otherwise, es
bb00: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
bb10: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a  r of rows.    **
bb20: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f   using the metho
bb30: 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  d described in t
bb40: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
bb50: 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  t for this funct
bb60: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
bb70: 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70  nDiff!=1 || pUpp
bb80: 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d  er==0 || pLower=
bb90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
bba0: 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74  nAdjust = (sqlit
bbb0: 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d  e3LogEst(p->nSam
bbc0: 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f  ple) - sqlite3Lo
bbd0: 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20  gEst(nDiff));.  
bbe0: 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
bbf0: 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20  -= nAdjust;.    
bc00: 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20    *pbDone = 1;. 
bc10: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
bc20: 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b  0x10, ("range sk
bc30: 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ip-scan regions:
bc40: 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d   %u..%u  adjust=
bc50: 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  %d est=%d\n",.  
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c           nLower,
bc80: 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74   nUpper, nAdjust
bc90: 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  *-1, pLoop->nOut
bca0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  ));.    }..  }el
bcb0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
bcc0: 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20  *pbDone==0 );.  
bcd0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  }..  sqlite3Valu
bce0: 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c  eFree(p1);.  sql
bcf0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32  ite3ValueFree(p2
bd00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
bd10: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
bd20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
bd30: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
bd40: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
bd50: 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  AT4 */../*.** Th
bd60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
bd70: 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20  sed to estimate 
bd80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
bd90: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
bda0: 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63  visited.** by sc
bdb0: 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  anning an index 
bdc0: 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76  for a range of v
bdd0: 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65  alues. The range
bde0: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70   may have an upp
bdf0: 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c  er.** bound, a l
be00: 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62  ower bound, or b
be10: 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63  oth. The WHERE c
be20: 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
be30: 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a   set the upper.*
be40: 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  * and lower boun
be50: 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ds are represent
be60: 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64  ed by pLower and
be70: 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
be80: 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61  vely. For.** exa
be90: 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  mple, assuming t
bea0: 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f  hat index p is o
beb0: 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20  n t1(a):.**.**  
bec0: 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
bed0: 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
bee0: 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20   ? ....**       
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f               |__
bf00: 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a  ___|   |_____|.*
bf10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
bf20: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
bf30: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
bf40: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65             pLowe
bf50: 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a  r    pUpper.**.*
bf60: 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
bf70: 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65  he upper or lowe
bf80: 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70  r bound is not p
bf90: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c  resent, then NUL
bfa0: 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a  L is passed in.*
bfb0: 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63  * place of the c
bfc0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
bfd0: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
bfe0: 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69  e value in (pBui
bff0: 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74  lder->pNew->u.bt
c000: 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20  ree.nEq) is the 
c010: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
c020: 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75  dex.** column su
c030: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e  bject to the ran
c040: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
c050: 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
c060: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
c070: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
c080: 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64  raints optimized
c090: 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
c0a0: 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
c0b0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73   example,.** ass
c0c0: 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
c0d0: 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
c0e0: 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
c0f0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
c100: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
c110: 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
c120: 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
c130: 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
c140: 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72  t to 1 (as the r
c150: 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
c160: 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68  column, b, is th
c170: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66  e second .** lef
c180: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
c190: 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
c1a0: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
c1b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
c1c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
c1d0: 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
c1e0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
c1f0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
c200: 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
c210: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
c220: 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pnOut is set to
c230: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45   the sqlite3LogE
c240: 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  st() of the.** n
c250: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
c260: 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61  at the index sca
c270: 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
c280: 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a   visit without .
c290: 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  ** considering t
c2a0: 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
c2b0: 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20  ints. If nEq is 
c2c0: 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69  0, then *pnOut i
c2d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c2e0: 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20  .** rows in the 
c2f0: 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
c300: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
c310: 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73   *pnOut is adjus
c320: 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a  ted (reduced).**
c330: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
c340: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
c350: 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64  aints pLower and
c360: 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20   pUpper..** .** 
c370: 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
c380: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41  f sqlite_stat4 A
c390: 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20  NALYZE data, or 
c3a0: 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e  if such data can
c3b0: 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
c3c0: 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69  a single range i
c3d0: 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
c3e0: 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
c3f0: 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
c400: 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70  f 4. .** and a p
c410: 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  air of constrain
c420: 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  ts (x>? AND x<?)
c430: 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70   reduces the exp
c440: 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a  ected number of.
c450: 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  ** rows visited 
c460: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36  by a factor of 6
c470: 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  4..*/.static int
c480: 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
c490: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
c4a0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
c4b0: 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
c4c0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
c4d0: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
c4e0: 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
c4f0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c  .  WhereTerm *pL
c500: 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72  ower,   /* Lower
c510: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
c520: 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22  nge. ex: "x>123"
c530: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c540: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
c550: 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65  Upper,   /* Uppe
c560: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
c570: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35  ange. ex: "x<455
c580: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c590: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
c5a0: 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64  pLoop     /* Mod
c5b0: 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e  ify the .nOut an
c5c0: 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69  d maybe .rRun fi
c5d0: 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  elds */.){.  int
c5e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c5f0: 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c  .  int nOut = pL
c600: 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67  oop->nOut;.  Log
c610: 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  Est nNew;..#ifde
c620: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c630: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
c640: 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f   Index *p = pLoo
c650: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
c660: 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
c670: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
c680: 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61  q;..  if( p->nSa
c690: 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d  mple>0 && nEq<p-
c6a0: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20  >nSampleCol ){. 
c6b0: 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69     if( nEq==pBui
c6c0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
c6d0: 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65  ){.      Unpacke
c6e0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20  dRecord *pRec = 
c6f0: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a  pBuilder->pRec;.
c700: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b        tRowcnt a[
c710: 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42  2];.      int nB
c720: 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  tm = pLoop->u.bt
c730: 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20  ree.nBtm;.      
c740: 69 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70  int nTop = pLoop
c750: 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a  ->u.btree.nTop;.
c760: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
c770: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
c780: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c790: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c7a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
c7b0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
c7c0: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
c7d0: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c7e0: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
c7f0: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
c800: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
c810: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
c820: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
c830: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
c840: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
c850: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
c860: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
c870: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
c880: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
c890: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
c8a0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c8b0: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
c8c0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
c8d0: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
c8e0: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
c8f0: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
c900: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
c910: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
c920: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
c930: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
c940: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
c950: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
c960: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
c970: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c980: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
c990: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
c9a0: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
c9b0: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
c9c0: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
c9d0: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
c9e0: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c9f0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
ca00: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
ca10: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
ca20: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
ca30: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
ca40: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
ca50: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
ca60: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
ca70: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
ca80: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
ca90: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
caa0: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
cab0: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
cac0: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
cad0: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
cae0: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
caf0: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
cb00: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
cb10: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
cb20: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
cb30: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
cb40: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
cb50: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
cb60: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
cb70: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
cb80: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
cb90: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
cba0: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
cbb0: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
cbc0: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
cbd0: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
cbe0: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
cbf0: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
cc00: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
cc10: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
cc20: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
cc30: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
cc40: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
cc50: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
cc60: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
cc70: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
cc80: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
cc90: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
cca0: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ccb0: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
ccc0: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
ccd0: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
cce0: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
ccf0: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
cd00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cd10: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
cd20: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
cd30: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
cd40: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
cd50: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
cd60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
cd70: 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77  * Determine iLow
cd80: 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73  er and iUpper us
cd90: 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a  ing ($P) only. *
cda0: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  /.      if( nEq=
cdb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  =0 ){.        iL
cdc0: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ower = 0;.      
cdd0: 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52    iUpper = p->nR
cde0: 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65  owEst0;.      }e
cdf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
ce00: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
ce10: 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
ce20: 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
ce30: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
ce40: 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  must .        **
ce50: 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
ce60: 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e  sted when testin
ce70: 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72  g key $P in wher
ce80: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e  eEqualScanEst().
ce90: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65    */.        whe
cea0: 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
ceb0: 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  );.        iLowe
ced0: 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
cee0: 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
cef0: 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  + a[1];.      }.
cf00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cf10: 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f  Lower==0 || (pLo
cf20: 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
cf30: 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21   (WO_GT|WO_GE))!
cf40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
cf50: 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c  rt( pUpper==0 ||
cf60: 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
cf70: 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
cf80: 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  LE))!=0 );.     
cf90: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72   assert( p->aSor
cfa0: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
cfb0: 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f     if( p->aSortO
cfc0: 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20  rder[nEq] ){.   
cfd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65       /* The role
cfe0: 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20  s of pLower and 
cff0: 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70 70  pUpper are swapp
d000: 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e  ed for a DESC in
d010: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  dex */.        S
d020: 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20  WAP(WhereTerm*, 
d030: 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b  pLower, pUpper);
d040: 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e  .        SWAP(in
d050: 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a  t, nBtm, nTop);.
d060: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d070: 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
d080: 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c  mprove on the iL
d090: 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  ower estimate us
d0a0: 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a  ing ($P:$L). */.
d0b0: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
d0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
d0d0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
d0e0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20        /* Values 
d0f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
d100: 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  Expr */.        
d110: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
d120: 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
d130: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
d140: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
d150: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
d160: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
d170: 78 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20  xpr, nBtm, nEq, 
d180: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  &n);.        if(
d190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d1a0: 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  & n ){.         
d1b0: 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20   tRowcnt iNew;. 
d1c0: 20 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73           u16 mas
d1d0: 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b  k = WO_GT|WO_LE;
d1e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
d1f0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
d200: 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20  Size(pExpr)>n ) 
d210: 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f  mask = (WO_LE|WO
d220: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _LT);.          
d230: 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iLwrIdx = whereK
d240: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d250: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
d260: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
d270: 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
d280: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61  ->eOperator & ma
d290: 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  sk) ? a[1] : 0);
d2a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
d2b0: 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f  New>iLower ) iLo
d2c0: 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  wer = iNew;.    
d2d0: 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
d2e0: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d          pLower =
d2f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
d300: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d310: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70  If possible, imp
d320: 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70  rove on the iUpp
d330: 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e  er estimate usin
d340: 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20  g ($P:$U). */.  
d350: 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29      if( pUpper )
d360: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78      /* Values ex
d390: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
d3a0: 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  pr */.        Ex
d3b0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
d3c0: 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
d3d0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
d3e0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
d3f0: 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
d400: 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
d410: 72 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e  r, nTop, nEq, &n
d420: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
d430: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d440: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  n ){.          t
d450: 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
d460: 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20         u16 mask 
d470: 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_GT|WO_LE;. 
d480: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
d490: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
d4a0: 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61  ze(pExpr)>n ) ma
d4b0: 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c  sk = (WO_LE|WO_L
d4c0: 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 55  T);.          iU
d4d0: 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79  prIdx = whereKey
d4e0: 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
d4f0: 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20   pRec, 1, a);.  
d500: 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61          iNew = a
d510: 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d 3e  [0] + ((pUpper->
d520: 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b  eOperator & mask
d530: 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
d540: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
d550: 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65  w<iUpper ) iUppe
d560: 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
d570: 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
d580: 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30        pUpper = 0
d590: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d5a0: 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c    }..      pBuil
d5b0: 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63  der->pRec = pRec
d5c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
d5d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d5e0: 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
d5f0: 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
d600: 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74      nNew = sqlit
d610: 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20  e3LogEst(iUpper 
d620: 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20  - iLower);.     
d630: 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
d640: 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20   If both iUpper 
d650: 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64  and iLower are d
d660: 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20  erived from the 
d670: 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a  same.          *
d680: 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61  * sample, then a
d690: 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34  ssume they are 4
d6a0: 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65  x more selective
d6b0: 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20  .  This brings. 
d6c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
d6d0: 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74  estimated select
d6e0: 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69  ivity more in li
d6f0: 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20  ne with what it 
d700: 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20  would be.       
d710: 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74     ** if estimat
d720: 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75  ed without the u
d730: 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61  se of STAT3/4 ta
d740: 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  bles. */.       
d750: 20 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d     if( iLwrIdx==
d760: 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d  iUprIdx ) nNew -
d770: 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32  = 20;  assert( 2
d780: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
d790: 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  (4) );.        }
d7a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d7b0: 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20  nNew = 10;      
d7c0: 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
d7d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
d7e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d7f0: 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75      if( nNew<nOu
d800: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  t ){.          n
d810: 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  Out = nNew;.    
d820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48      }.        WH
d830: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28  ERETRACE(0x10, (
d840: 22 53 54 41 54 34 20 72 61 6e 67 65 20 73 63 61  "STAT4 range sca
d850: 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25  n: %u..%u  est=%
d860: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
d890: 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29  32)iUpper, nOut)
d8a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d8b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
d8c0: 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20  bDone = 0;.     
d8d0: 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
d8e0: 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61 72  SkipScanEst(pPar
d8f0: 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70  se, pLower, pUpp
d900: 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e  er, pLoop, &bDon
d910: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44  e);.      if( bD
d920: 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b  one ) return rc;
d930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
d940: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d950: 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
d960: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d970: 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73  pBuilder);.  ass
d980: 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70  ert( pLower || p
d990: 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a  Upper );.#endif.
d9a0: 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72    assert( pUpper
d9b0: 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e  ==0 || (pUpper->
d9c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
d9d0: 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e  NULL)==0 );.  nN
d9e0: 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41  ew = whereRangeA
d9f0: 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f  djust(pLower, nO
da00: 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68  ut);.  nNew = wh
da10: 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70  ereRangeAdjust(p
da20: 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20  Upper, nNew);.. 
da30: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
da40: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
da50: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
da60: 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65  limit and neithe
da70: 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73  r limit.  ** has
da80: 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d   an application-
da90: 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f  defined likeliho
daa0: 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65  od(), assume the
dab0: 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72   range is.  ** r
dac0: 65 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64  educed by an add
dad0: 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69  itional 75%. Thi
dae0: 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79  s means that, by
daf0: 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65   default, an ope
db00: 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e  n-ended.  ** ran
db10: 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63  ge query (e.g. c
db20: 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d  ol > ?) is assum
db30: 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20  ed to match 1/4 
db40: 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  of the rows in t
db50: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57  he.  ** index. W
db60: 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61  hile a closed ra
db70: 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45  nge (e.g. col BE
db80: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69  TWEEN ? AND ?) i
db90: 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20  s estimated to. 
dba0: 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f   ** match 1/64 o
dbb0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20  f the index. */ 
dbc0: 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
dbd0: 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72   pLower->truthPr
dbe0: 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72 20 26  ob>0 && pUpper &
dbf0: 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50  & pUpper->truthP
dc00: 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65  rob>0 ){.    nNe
dc10: 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20  w -= 20;.  }..  
dc20: 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21  nOut -= (pLower!
dc30: 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30  =0) + (pUpper!=0
dc40: 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30  );.  if( nNew<10
dc50: 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20   ) nNew = 10;.  
dc60: 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20  if( nNew<nOut ) 
dc70: 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66  nOut = nNew;.#if
dc80: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
dc90: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
dca0: 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e  f( pLoop->nOut>n
dcb0: 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45  Out ){.    WHERE
dcc0: 54 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e  TRACE(0x10,("Ran
dcd0: 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e  ge scan lowers n
dce0: 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  Out from %d to %
dcf0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
dd00: 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
dd10: 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20  >nOut, nOut));. 
dd20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f   }.#endif.  pLoo
dd30: 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
dd40: 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  t)nOut;.  return
dd50: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
dd60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
dd70: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
dd80: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
dd90: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
dda0: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
ddb0: 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
ddc0: 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
ddd0: 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
dde0: 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
ddf0: 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
de00: 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
de10: 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
de20: 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
de30: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
de40: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
de50: 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
de60: 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
de70: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
de80: 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
de90: 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
dea0: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
deb0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
dec0: 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
ded0: 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
dee0: 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
def0: 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
df00: 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
df10: 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
df20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
df30: 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
df40: 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
df50: 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
df60: 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
df70: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
df80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
df90: 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
dfa0: 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
dfb0: 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
dfc0: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
dfd0: 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
dfe0: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
dff0: 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
e000: 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
e010: 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
e020: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
e030: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
e040: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
e050: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
e060: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
e070: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
e080: 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
e090: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
e0a0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e0b0: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
e0c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e0d0: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
e0e0: 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
e0f0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
e100: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
e110: 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
e120: 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
e130: 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
e140: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
e150: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
e160: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
e170: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
e180: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
e190: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
e1a0: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
e1b0: 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  Eq = pBuilder->p
e1c0: 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
e1d0: 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
e1e0: 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c  rd *pRec = pBuil
e1f0: 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74  der->pRec;.  int
e200: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
e210: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
e220: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
e230: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
e240: 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
e250: 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
e260: 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20  /.  int bOk;..  
e270: 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20 29  assert( nEq>=1 )
e280: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3c  ;.  assert( nEq<
e290: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  =p->nColumn );. 
e2a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
e2b0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ple!=0 );.  asse
e2c0: 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  rt( p->nSample>0
e2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
e2e0: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
e2f0: 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49  d<nEq );..  /* I
e300: 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74  f values are not
e310: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
e320: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
e330: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 65   index to the le
e340: 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  ft.  ** of this 
e350: 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65  one, no estimate
e360: 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52 65   can be made. Re
e370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
e380: 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70  OUND. */.  if( p
e390: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e3a0: 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20  id<(nEq-1) ){.  
e3b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e3c0: 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20  NOTFOUND;.  }.. 
e3d0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   /* This is an o
e3e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
e3f0: 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  . The call to sq
e400: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
e410: 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62  etValue().  ** b
e420: 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75 72  elow would retur
e430: 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  n the same value
e440: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e  .  */.  if( nEq>
e450: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  =p->nColumn ){. 
e460: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20     *pnRow = 1;. 
e470: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e480: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
e490: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
e4a0: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
e4b0: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
e4c0: 70 72 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62  pr, 1, nEq-1, &b
e4d0: 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  Ok);.  pBuilder-
e4e0: 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
e4f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e500: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
e510: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65   if( bOk==0 ) re
e520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
e530: 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72  OUND;.  pBuilder
e540: 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45  ->nRecValid = nE
e550: 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74  q;..  whereKeySt
e560: 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
e570: 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48  Rec, 0, a);.  WH
e580: 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
e590: 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65  equality scan re
e5a0: 67 69 6f 6e 73 20 25 73 28 25 64 29 3a 20 25 64  gions %s(%d): %d
e5b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
e5c0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65          p->zName
e5d0: 2c 20 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b  , nEq-1, (int)a[
e5e0: 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d  1]));.  *pnRow =
e5f0: 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75   a[1];.  .  retu
e600: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e610: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
e620: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
e630: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
e640: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
e650: 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73  R_STAT4./*.** Es
e660: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
e670: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
e680: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
e690: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49  based on.** an I
e6a0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65  N constraint whe
e6b0: 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
e6c0: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
e6d0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
e6e0: 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  a list of values
e6f0: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
e700: 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78  *        WHERE x
e710: 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a   IN (1,2,3,4).**
e720: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
e730: 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
e740: 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
e750: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
e760: 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
e770: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
e780: 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
e790: 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
e7a0: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
e7b0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
e7c0: 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
e7d0: 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
e7e0: 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
e7f0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
e800: 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
e810: 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
e820: 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
e830: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
e840: 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
e850: 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
e860: 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
e870: 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
e880: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
e890: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
e8a0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
e8b0: 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74  t whereInScanEst
e8c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e8d0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
e8e0: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
e8f0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
e900: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
e910: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
e920: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e930: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c  ,     /* The val
e940: 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52  ue list on the R
e950: 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c  HS of "x IN (v1,
e960: 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20  v2,v3,...)" */. 
e970: 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20   tRowcnt *pnRow 
e980: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
e990: 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65  he revised row e
e9a0: 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a  stimate here */.
e9b0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
e9c0: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
e9d0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
e9e0: 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71    i64 nRow0 = sq
e9f0: 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
ea00: 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  (p->aiRowLogEst[
ea10: 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56  0]);.  int nRecV
ea20: 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
ea30: 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e  >nRecValid;.  in
ea40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ea50: 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63  ;     /* Subfunc
ea60: 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
ea70: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45   */.  tRowcnt nE
ea80: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
ea90: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
eaa0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72  for a single ter
eab0: 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  m */.  tRowcnt n
eac0: 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f  RowEst = 0;    /
ead0: 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
eae0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
eaf0: 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
eb20: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
eb30: 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b  p->aSample!=0 );
eb40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
eb50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
eb60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
eb70: 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52  ){.    nEst = nR
eb80: 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ow0;.    rc = wh
eb90: 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
eba0: 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
ebb0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
ebc0: 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20  xpr, &nEst);.   
ebd0: 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74   nRowEst += nEst
ebe0: 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
ebf0: 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63  nRecValid = nRec
ec00: 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66  Valid;.  }..  if
ec10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ec20: 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  ){.    if( nRowE
ec30: 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f  st > nRow0 ) nRo
ec40: 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  wEst = nRow0;.  
ec50: 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
ec60: 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
ec70: 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77  CE(0x10,("IN row
ec80: 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25   estimate: est=%
ec90: 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b  d\n", nRowEst));
eca0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ecb0: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
ecc0: 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b  id==nRecValid );
ecd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ece0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ecf0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
ed00: 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64  _STAT4 */...#ifd
ed10: 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
ed20: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ABLED./*.** Prin
ed30: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
ed40: 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a   a WhereTerm obj
ed50: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
ed60: 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e  id whereTermPrin
ed70: 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
ed80: 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a  rm, int iTerm){.
ed90: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
eda0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
edb0: 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25  ugPrintf("TERM-%
edc0: 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65  -3d NULL\n", iTe
edd0: 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rm);.  }else{.  
ede0: 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b    char zType[4];
edf0: 0a 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74 5b  .    char zLeft[
ee00: 35 30 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  50];.    memcpy(
ee10: 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29  zType, "...", 4)
ee20: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
ee30: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
ee40: 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b  VIRTUAL ) zType[
ee50: 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66  0] = 'V';.    if
ee60: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
ee70: 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29  or & WO_EQUIV  )
ee80: 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b   zType[1] = 'E';
ee90: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
eea0: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
eeb0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
eec0: 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d  in) ) zType[2] =
eed0: 20 27 4c 27 3b 0a 20 20 20 20 69 66 28 20 70 54   'L';.    if( pT
eee0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
eef0: 20 57 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20   WO_SINGLE ){.  
ef00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ef10: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66  intf(sizeof(zLef
ef20: 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b  t),zLeft,"left={
ef30: 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
ef60: 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  r, pTerm->u.left
ef70: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c  Column);.    }el
ef80: 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
ef90: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52  Operator & WO_OR
efa0: 29 21 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e 75  )!=0 && pTerm->u
efb0: 2e 70 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20  .pOrInfo!=0 ){. 
efc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
efd0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
efe0: 66 74 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78  ft),zLeft,"index
eff0: 61 62 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20  able=0x%lld", . 
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70        pTerm->u.p
f020: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
f030: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
f040: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
f050: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65  rintf(sizeof(zLe
f060: 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d  ft),zLeft,"left=
f070: 25 64 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74  %d", pTerm->left
f080: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
f090: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
f0a0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 54  rintf(.       "T
f0b0: 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20 25  ERM-%-3d %p %s %
f0c0: 2d 31 32 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f  -12s prob=%-3d o
f0d0: 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67 73  p=0x%03x wtFlags
f0e0: 3d 30 78 25 30 34 78 22 2c 0a 20 20 20 20 20 20  =0x%04x",.      
f0f0: 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a   iTerm, pTerm, z
f100: 54 79 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65  Type, zLeft, pTe
f110: 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20  rm->truthProb,. 
f120: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
f130: 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77  erator, pTerm->w
f140: 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  tFlags);.    if(
f150: 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29   pTerm->iField )
f160: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
f170: 65 62 75 67 50 72 69 6e 74 66 28 22 20 69 46 69  ebugPrintf(" iFi
f180: 65 6c 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d  eld=%d\n", pTerm
f190: 2d 3e 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d  ->iField);.    }
f1a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
f1b0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f1c0: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
f1d0: 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
f1e0: 78 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45  xpr(0, pTerm->pE
f1f0: 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23  xpr, 0);.  }.}.#
f200: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48  endif..#ifdef WH
f210: 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
f220: 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20  ./*.** Show the 
f230: 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
f240: 20 6f 66 20 61 20 57 68 65 72 65 43 6c 61 75 73   of a WhereClaus
f250: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
f260: 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69 6e  3WhereClausePrin
f270: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
f280: 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  WC){.  int i;.  
f290: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e  for(i=0; i<pWC->
f2a0: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
f2b0: 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28   whereTermPrint(
f2c0: 26 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a  &pWC->a[i], i);.
f2d0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
f2e0: 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
f2f0: 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72  ENABLED./*.** Pr
f300: 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  int a WhereLoop 
f310: 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67  object for debug
f320: 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ging purposes.*/
f330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f340: 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72  reLoopPrint(Wher
f350: 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43  eLoop *p, WhereC
f360: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57  lause *pWC){.  W
f370: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
f380: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
f390: 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57    int nb = 1+(pW
f3a0: 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
f3b0: 6e 53 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72  nSrc+3)/4;.  str
f3c0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f3d0: 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f   *pItem = pWInfo
f3e0: 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  ->pTabList->a + 
f3f0: 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65  p->iTab;.  Table
f400: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
f410: 70 54 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20  pTab;.  Bitmask 
f420: 6d 41 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61 73  mAll = (((Bitmas
f430: 6b 29 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20  k)1)<<(nb*4)) - 
f440: 31 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  1;.  sqlite3Debu
f450: 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25  gPrintf("%c%2d.%
f460: 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70  0*llx.%0*llx", p
f470: 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ->cId,.         
f480: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
f490: 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b  Tab, nb, p->mask
f4a0: 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65  Self, nb, p->pre
f4b0: 72 65 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73  req & mAll);.  s
f4c0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f4d0: 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20 20  f(" %12s",.     
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
f500: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
f510: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f520: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
f530: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
f540: 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
f550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
f560: 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  e;.    if( p->u.
f570: 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26 20  btree.pIndex && 
f580: 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74  (zName = p->u.bt
f590: 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ree.pIndex->zNam
f5a0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
f5b0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65  f( strncmp(zName
f5c0: 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
f5d0: 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b  dex_", 17)==0 ){
f5e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
f5f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
f600: 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  (zName) - 1;.   
f610: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d       while( zNam
f620: 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b  e[i]!='_' ) i--;
f630: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b  .        zName +
f640: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
f650: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
f660: 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25 32  rintf(".%-16s %2
f670: 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e  d", zName, p->u.
f680: 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20  btree.nEq);.    
f690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f6a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f6b0: 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20 20  "%20s","");.    
f6c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
f6d0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
f6e0: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
f6f0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
f700: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
f710: 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a  %d,\"%s\",%x)",.
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
f740: 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  , p->u.vtab.idxS
f750: 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d  tr, p->u.vtab.om
f760: 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c  itMask);.    }el
f770: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
f780: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 28  lite3_mprintf("(
f790: 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74  %d,%x)", p->u.vt
f7a0: 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e  ab.idxNum, p->u.
f7b0: 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a  vtab.omitMask);.
f7c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f7d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
f7e0: 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73  -19s", z);.    s
f7f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
f800: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73 46    }.  if( p->wsF
f810: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
f820: 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c  PSCAN ){.    sql
f830: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f840: 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22 2c  " f %05x %d-%d",
f850: 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e   p->wsFlags, p->
f860: 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29  nLTerm,p->nSkip)
f870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
f880: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f890: 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64 22  f(" f %05x N %d"
f8a0: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
f8b0: 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  >nLTerm);.  }.  
f8c0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f8d0: 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64 2c  tf(" cost %d,%d,
f8e0: 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70  %d\n", p->rSetup
f8f0: 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
f900: 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c  ut);.  if( p->nL
f910: 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33  Term && (sqlite3
f920: 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31  WhereTrace & 0x1
f930: 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  00)!=0 ){.    in
f940: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f950: 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69  ; i<p->nLTerm; i
f960: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
f970: 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54  TermPrint(p->aLT
f980: 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20  erm[i], i);.    
f990: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
f9a0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75  /*.** Convert bu
f9b0: 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61  lk memory into a
f9c0: 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70   valid WhereLoop
f9d0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61 73   that can be pas
f9e0: 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c  sed.** to whereL
f9f0: 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65 73  oopClear harmles
fa00: 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sly..*/.static v
fa10: 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  oid whereLoopIni
fa20: 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  t(WhereLoop *p){
fa30: 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70  .  p->aLTerm = p
fa40: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20  ->aLTermSpace;. 
fa50: 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a   p->nLTerm = 0;.
fa60: 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72    p->nLSlot = Ar
fa70: 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72  raySize(p->aLTer
fa80: 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73  mSpace);.  p->ws
fa90: 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Flags = 0;.}../*
faa0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57 68  .** Clear the Wh
fab0: 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e  ereLoop.u union.
fac0: 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f 6f    Leave WhereLoo
fad0: 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e  p.pLTerm intact.
fae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
faf0: 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e  whereLoopClearUn
fb00: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
fb10: 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
fb20: 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73    if( p->wsFlags
fb30: 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55 41   & (WHERE_VIRTUA
fb40: 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55 54  LTABLE|WHERE_AUT
fb50: 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  O_INDEX) ){.    
fb60: 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
fb70: 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
fb80: 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e 75  ABLE)!=0 && p->u
fb90: 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
fba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
fbb0: 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69  free(p->u.vtab.i
fbc0: 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70 2d  dxStr);.      p-
fbd0: 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
fbe0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75   = 0;.      p->u
fbf0: 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20 30  .vtab.idxStr = 0
fc00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fc10: 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
fc20: 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
fc30: 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65  =0 && p->u.btree
fc40: 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  .pIndex!=0 ){.  
fc50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
fc60: 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
fc70: 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66  .pIndex->zColAff
fc80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fc90: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e  DbFreeNN(db, p->
fca0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b  u.btree.pIndex);
fcb0: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65  .      p->u.btre
fcc0: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
fcd0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
fce0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65   Deallocate inte
fcf0: 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64  rnal memory used
fd00: 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20   by a WhereLoop 
fd10: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
fd20: 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43   void whereLoopC
fd30: 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62  lear(sqlite3 *db
fd40: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
fd50: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d  .  if( p->aLTerm
fd60: 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  !=p->aLTermSpace
fd70: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
fd80: 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  NN(db, p->aLTerm
fd90: 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  );.  whereLoopCl
fda0: 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b  earUnion(db, p);
fdb0: 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
fdc0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  (p);.}../*.** In
fdd0: 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  crease the memor
fde0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72  y allocation for
fdf0: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d   pLoop->aLTerm[]
fe00: 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
fe10: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
fe20: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
fe30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fe40: 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20  ereLoop *p, int 
fe50: 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  n){.  WhereTerm 
fe60: 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20 70  **paNew;.  if( p
fe70: 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65  ->nLSlot>=n ) re
fe80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fe90: 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a    n = (n+7)&~7;.
fea0: 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74 65    paNew = sqlite
feb0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
fec0: 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  b, sizeof(p->aLT
fed0: 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66  erm[0])*n);.  if
fee0: 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  ( paNew==0 ) ret
fef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ff00: 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28  _BKPT;.  memcpy(
ff10: 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
ff20: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
ff30: 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
ff40: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
ff50: 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
ff60: 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
ff70: 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65  eeNN(db, p->aLTe
ff80: 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d  rm);.  p->aLTerm
ff90: 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e   = paNew;.  p->n
ffa0: 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74  LSlot = n;.  ret
ffb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ffc0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
ffd0: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
ffe0: 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69  e second pLoop i
fff0: 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a  nto the first..*
10000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
10010 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74  reLoopXfer(sqlit
10020 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
10030 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f  p *pTo, WhereLoo
10040 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65  p *pFrom){.  whe
10050 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
10060 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28  (db, pTo);.  if(
10070 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
10080 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d  (db, pTo, pFrom-
10090 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  >nLTerm) ){.    
100a0 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20  memset(&pTo->u, 
100b0 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75  0, sizeof(pTo->u
100c0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
100d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
100e0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70  ;.  }.  memcpy(p
100f0 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45  To, pFrom, WHERE
10100 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a  _LOOP_XFER_SZ);.
10110 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c    memcpy(pTo->aL
10120 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54  Term, pFrom->aLT
10130 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d  erm, pTo->nLTerm
10140 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54  *sizeof(pTo->aLT
10150 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  erm[0]));.  if( 
10160 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26  pFrom->wsFlags &
10170 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
10180 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d  BLE ){.    pFrom
10190 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
101a0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
101b0 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61  f( (pFrom->wsFla
101c0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
101d0 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
101e0 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e   pFrom->u.btree.
101f0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
10200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10210 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  OK;.}../*.** Del
10220 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ete a WhereLoop 
10230 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
10240 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44   void whereLoopD
10250 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
10260 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
10270 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  {.  whereLoopCle
10280 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c  ar(db, p);.  sql
10290 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
102a0 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
102b0 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
102c0 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
102d0 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
102e0 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
102f0 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
10300 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
10310 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
10320 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10330 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
10340 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
10350 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20       WhereLevel 
10360 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
10370 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  o->a[i];.      i
10380 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
10390 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
103a0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
103b0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
103c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
103d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
103e0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
103f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10400 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
10410 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
10420 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
10430 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
10440 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
10450 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
10460 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
10470 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
10480 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
10490 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
104a0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
104b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
104c0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
104d0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WInfo);.  }.}../
104e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
104f0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
10500 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
10510 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
10520 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f  X has the same o
10530 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
10540 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20  t Y.**   (2)  X 
10550 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10560 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29  et of Y.**   (3)
10570 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61    X skips at lea
10580 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d  st as many colum
10590 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79  ns as Y.**.** By
105a0 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74 22   "proper subset"
105b0 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20   we mean that X 
105c0 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52 45  uses fewer WHERE
105d0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a   clause terms.**
105e0 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74   than Y and that
105f0 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
10600 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62 79  use term used by
10610 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a   X is also used.
10620 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49  ** by Y..**.** I
10630 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  f X is a proper 
10640 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e  subset of Y then
10650 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20 63   Y is a better c
10660 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a  hoice and ought.
10670 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77  ** to have a low
10680 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72  er cost.  This r
10690 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54  outine returns T
106a0 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f  RUE when that co
106b0 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73  st .** relations
106c0 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64 20  hip is inverted 
106d0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
106e0 61 64 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74  adjusted.  The t
106f0 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73  hird rule.** was
10700 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20 69   added because i
10710 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63  f X uses skip-sc
10720 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69  an less than Y i
10730 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a  t still might.**
10740 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72   deserve a lower
10750 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74   cost even if it
10760 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
10770 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61  set of Y..*/.sta
10780 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
10790 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
107a0 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68  bset(.  const Wh
107b0 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20  ereLoop *pX,    
107c0 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72     /* First Wher
107d0 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65  eLoop to compare
107e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72   */.  const Wher
107f0 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20  eLoop *pY       
10800 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69   /* Compare agai
10810 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f  nst this WhereLo
10820 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  op */.){.  int i
10830 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e  , j;.  if( pX->n
10840 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20  LTerm-pX->nSkip 
10850 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59  >= pY->nLTerm-pY
10860 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72  ->nSkip ){.    r
10870 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73  eturn 0; /* X is
10880 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66   not a subset of
10890 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20   Y */.  }.  if( 
108a0 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e  pY->nSkip > pX->
108b0 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30  nSkip ) return 0
108c0 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e  ;.  if( pX->rRun
108d0 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a   >= pY->rRun ){.
108e0 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e      if( pX->rRun
108f0 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65   > pY->rRun ) re
10900 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
10910 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
10920 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d  Y */.    if( pX-
10930 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74  >nOut > pY->nOut
10940 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10950 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20  /* X costs more 
10960 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20  than Y */.  }.  
10970 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d  for(i=pX->nLTerm
10980 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
10990 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65      if( pX->aLTe
109a0 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rm[i]==0 ) conti
109b0 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70  nue;.    for(j=p
109c0 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d  Y->nLTerm-1; j>=
109d0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69  0; j--){.      i
109e0 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  f( pY->aLTerm[j]
109f0 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20  ==pX->aLTerm[i] 
10a00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
10a10 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74     if( j<0 ) ret
10a20 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74  urn 0;  /* X not
10a30 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 73   a subset of Y s
10a40 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e  ince term X[i] n
10a50 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a  ot used by Y */.
10a60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20    }.  return 1; 
10a70 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f   /* All conditio
10a80 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a  ns meet */.}../*
10a90 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73  .** Try to adjus
10aa0 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68  t the cost of Wh
10ab0 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74  ereLoop pTemplat
10ac0 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77  e upwards or dow
10ad0 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61  nwards so.** tha
10ae0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70  t:.**.**   (1) p
10af0 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c  Template costs l
10b00 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68  ess than any oth
10b10 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68  er WhereLoops th
10b20 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a  at are a proper.
10b30 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74 20  **       subset 
10b40 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a  of pTemplate.**.
10b50 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61  **   (2) pTempla
10b60 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68  te costs more th
10b70 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
10b80 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63  reLoops for whic
10b90 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20  h pTemplate.**  
10ba0 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65 72       is a proper
10bb0 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   subset..**.** T
10bc0 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70  o say "WhereLoop
10bd0 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73   X is a proper s
10be0 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e  ubset of Y" mean
10bf0 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  s that X uses fe
10c00 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  wer.** WHERE cla
10c10 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59  use terms than Y
10c20 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
10c30 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
10c40 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a  m used by X is.*
10c50 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59  * also used by Y
10c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10c70 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74   whereLoopAdjust
10c80 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65  Cost(const Where
10c90 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f  Loop *p, WhereLo
10ca0 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a  op *pTemplate){.
10cb0 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65    if( (pTemplate
10cc0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
10cd0 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20  E_INDEXED)==0 ) 
10ce0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20  return;.  for(; 
10cf0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f  p; p=p->pNextLoo
10d00 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  p){.    if( p->i
10d10 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
10d20 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iTab ) continue;
10d30 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
10d40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
10d50 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69  EXED)==0 ) conti
10d60 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65  nue;.    if( whe
10d70 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f  reLoopCheaperPro
10d80 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54 65  perSubset(p, pTe
10d90 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  mplate) ){.     
10da0 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70   /* Adjust pTemp
10db0 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61  late cost downwa
10dc0 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
10dd0 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69 74   cheaper than it
10de0 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73  s .      ** subs
10df0 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57  et p. */.      W
10e00 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c 28  HERETRACE(0x80,(
10e10 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a  "subset cost adj
10e20 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f  ustment %d,%d to
10e30 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d,%d\n",.     
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
10e60 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  n, pTemplate->nO
10e70 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e  ut, p->rRun, p->
10e80 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20  nOut-1));.      
10e90 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
10ea0 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20  = p->rRun;.     
10eb0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10ec0 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a   = p->nOut - 1;.
10ed0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68      }else if( wh
10ee0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
10ef0 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d 70  operSubset(pTemp
10f00 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  late, p) ){.    
10f10 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
10f20 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61 72  plate cost upwar
10f30 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
10f40 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20  costlier than p 
10f50 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70  since.      ** p
10f60 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72  Template is a pr
10f70 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 70  oper subset of p
10f80 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
10f90 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
10fa0 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
10fb0 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
10fc0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
10fe0 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
10ff0 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
11000 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b  ->rRun, p->nOut+
11010 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
11020 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
11030 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
11040 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
11050 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d  >nOut + 1;.    }
11060 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
11070 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66  arch the list of
11080 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a   WhereLoops in *
11090 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66  ppPrev looking f
110a0 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  or one that can 
110b0 62 65 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64  be.** supplanted
110c0 20 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a   by pTemplate..*
110d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  *.** Return NULL
110e0 20 69 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   if the WhereLoo
110f0 70 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  p list contains 
11100 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 61  an entry that ca
11110 6e 20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54  n supplant.** pT
11120 65 6d 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65  emplate, in othe
11130 72 20 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70  r words if pTemp
11140 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65  late does not be
11150 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74  long on the list
11160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73  ..**.** If pX is
11170 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   a WhereLoop tha
11180 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  t pTemplate can 
11190 73 75 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72  supplant, then r
111a0 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
111b0 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
111c0 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
111d0 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73  emplate cannot s
111e0 75 70 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73  upplant any exis
111f0 74 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  ting element of 
11200 74 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65  the list but nee
11210 64 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65  ds.** to be adde
11220 64 20 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74  d to the list, t
11230 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
11240 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c  nter to the tail
11250 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   of the list..*/
11260 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f  .static WhereLoo
11270 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e  p **whereLoopFin
11280 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72 65  dLesser(.  Where
11290 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20  Loop **ppPrev,. 
112a0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
112b0 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20   *pTemplate.){. 
112c0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
112d0 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29   for(p=(*ppPrev)
112e0 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e  ; p; ppPrev=&p->
112f0 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70  pNextLoop, p=*pp
11300 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70  Prev){.    if( p
11310 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74  ->iTab!=pTemplat
11320 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53  e->iTab || p->iS
11330 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74  ortIdx!=pTemplat
11340 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20  e->iSortIdx ){. 
11350 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65       /* If eithe
11360 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69 53  r the iTab or iS
11370 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f  ortIdx values fo
11380 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20  r two WhereLoop 
11390 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  are different.  
113a0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73      ** then thos
113b0 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65  e WhereLoops nee
113c0 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72  d to be consider
113d0 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
113e0 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20 20  Neither is.     
113f0 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20   ** a candidate 
11400 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f  to replace the o
11410 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63  ther. */.      c
11420 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
11430 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72     /* In the cur
11440 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
11450 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20  ion, the rSetup 
11460 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
11470 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74  zero.    ** or t
11480 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64  he cost of build
11490 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
114a0 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61   index (NlogN) a
114b0 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20  nd the NlogN.   
114c0 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
114d0 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57  for compatible W
114e0 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20  hereLoops. */.  
114f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
11500 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c  tup==0 || pTempl
11510 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a  ate->rSetup==0 .
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70   || p->rSetup==p
11540 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
11550 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72   );..    /* wher
11560 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20  eLoopAddBtree() 
11570 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65 73  always generates
11580 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65   and inserts the
11590 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
115a0 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72  .    ** case fir
115b0 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61  st.  Hence compa
115c0 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20  tible candidate 
115d0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72  WhereLoops never
115e0 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20   have a larger. 
115f0 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61     ** rSetup. Ca
11600 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e  ll this SETUP-IN
11610 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61  VARIANT */.    a
11620 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
11630 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
11640 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  tup );..    /* A
11650 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e  ny loop using an
11660 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69   appliation-defi
11670 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52  ned index (or PR
11680 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20  IMARY KEY or.   
11690 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   ** UNIQUE const
116a0 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20  raint) with one 
116b0 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74  or more == const
116c0 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65 72  raints is better
116d0 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20  .    ** than an 
116e0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
116f0 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20   Unless it is a 
11700 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20  skip-scan. */.  
11710 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
11720 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
11730 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26  NDEX)!=0.     &&
11740 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b   (pTemplate->nSk
11750 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ip)==0.     && (
11760 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
11770 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
11780 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ED)!=0.     && (
11790 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
117a0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
117b0 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26  N_EQ)!=0.     &&
117c0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
117d0 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
117e0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
117f0 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  req.    ){.     
11800 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11810 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e     /* If existin
11820 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73  g WhereLoop p is
11830 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54 65   better than pTe
11840 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74  mplate, pTemplat
11850 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  e can be.    ** 
11860 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65 72  discarded.  Wher
11870 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
11880 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28  r if:.    **   (
11890 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72  1)  p has no mor
118a0 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  e dependencies t
118b0 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61  han pTemplate, a
118c0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20  nd.    **   (2) 
118d0 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20   p has an equal 
118e0 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
118f0 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20  an pTemplate.   
11900 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   */.    if( (p->
11910 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
11920 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e  te->prereq)==p->
11930 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29  prereq    /* (1)
11940 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e    */.     && p->
11950 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74  rSetup<=pTemplat
11960 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20 20  e->rSetup       
11970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11980 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  a) */.     && p-
11990 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65  >rRun<=pTemplate
119a0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
119b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
119c0 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2b) */.     && p
119d0 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74  ->nOut<=pTemplat
119e0 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20  e->nOut         
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a00 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20  (2c) */.    ){. 
11a10 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
11a20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d 70  /* Discard pTemp
11a30 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  late */.    }.. 
11a40 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61     /* If pTempla
11a50 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65 74  te is always bet
11a60 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e  ter than p, then
11a70 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f   cause p to be o
11a80 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  verwritten.    *
11a90 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  * with pTemplate
11aa0 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  .  pTemplate is 
11ab0 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69 66  better than p if
11ac0 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20  :.    **   (1)  
11ad0 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f  pTemplate has no
11ae0 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65   more dependence
11af0 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20  s than p, and.  
11b00 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d    **   (2)  pTem
11b10 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71 75  plate has an equ
11b20 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  al or lower cost
11b30 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a   than p..    */.
11b40 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
11b50 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
11b60 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61  prereq)==pTempla
11b70 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20  te->prereq   /* 
11b80 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20  (1)  */.     && 
11b90 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61  p->rRun>=pTempla
11ba0 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20  te->rRun        
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
11bd0 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e       && p->nOut>
11be0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c10 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20  (2b) */.    ){. 
11c20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
11c30 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74  rSetup>=pTemplat
11c40 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20  e->rSetup ); /* 
11c50 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20  SETUP-INVARIANT 
11c60 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62  above */.      b
11c70 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65  reak;   /* Cause
11c80 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
11c90 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74  tten by pTemplat
11ca0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e */.    }.  }. 
11cb0 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a   return ppPrev;.
11cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
11cd0 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68 65  or replace a Whe
11ce0 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69  reLoop entry usi
11cf0 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ng the template 
11d00 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  supplied..**.** 
11d10 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  An existing Wher
11d20 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68  eLoop entry migh
11d30 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  t be overwritten
11d40 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70   if the new temp
11d50 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65  late.** is bette
11d60 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72 20  r and has fewer 
11d70 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f  dependencies.  O
11d80 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77  r the template w
11d90 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a  ill be ignored.*
11da0 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20  * and no insert 
11db0 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e  will occur if an
11dc0 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11dd0 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61 6e  oop is faster an
11de0 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64  d has.** fewer d
11df0 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
11e00 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20   the template.  
11e10 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77 20  Otherwise a new 
11e20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20  WhereLoop is.** 
11e30 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74  added based on t
11e40 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  he template..**.
11e50 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  ** If pBuilder->
11e60 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55  pOrSet is not NU
11e70 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65 20  LL then we care 
11e80 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a  about only the.*
11e90 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  * prerequisites 
11ea0 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75  and rRun and nOu
11eb0 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e  t costs of the N
11ec0 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68   best loops.  Th
11ed0 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  at.** informatio
11ee0 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69 6e  n is gathered in
11ef0 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70   the pBuilder->p
11f00 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  OrSet object.  T
11f10 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70  his special.** p
11f20 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69  rocessing mode i
11f30 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20  s used only for 
11f40 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
11f50 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  sing..**.** When
11f60 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75   accumulating mu
11f70 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68  ltiple loops (wh
11f80 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  en pBuilder->pOr
11f90 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a  Set is NULL) we.
11fa0 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f  ** still might o
11fb0 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72  verwrite similar
11fc0 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20   loops with the 
11fd0 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20  new template if 
11fe0 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c  the.** new templ
11ff0 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20 20  ate is better.  
12000 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65  Loops may be ove
12010 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
12020 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f  following .** co
12030 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74  nditions are met
12040 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
12050 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61  They have the sa
12060 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28  me iTab..**    (
12070 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68  2)  They have th
12080 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e  e same iSortIdx.
12090 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65 20  .**    (3)  The 
120a0 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d  template has sam
120b0 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e  e or fewer depen
120c0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65  dencies than the
120d0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a   current loop.**
120e0 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65 6d      (4)  The tem
120f0 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73 61  plate has the sa
12100 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74  me or lower cost
12110 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
12120 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63  t loop.*/.static
12130 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e   int whereLoopIn
12140 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  sert(WhereLoopBu
12150 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
12160 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
12170 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c  plate){.  WhereL
12180 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70  oop **ppPrev, *p
12190 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ;.  WhereInfo *p
121a0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
121b0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69  ->pWInfo;.  sqli
121c0 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
121d0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
121e0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66  int rc;..  /* If
121f0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
12200 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  t is defined, th
12210 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61  en only keep tra
12220 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  ck of the costs.
12230 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73    ** and prereqs
12240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75  ..  */.  if( pBu
12250 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30  ilder->pOrSet!=0
12260 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
12270 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b  plate->nLTerm ){
12280 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
12290 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31  ENABLED.      u1
122a0 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
122b0 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20  pOrSet->n;.     
122c0 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
122d0 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
122e0 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f  ert(pBuilder->pO
122f0 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d  rSet, pTemplate-
12300 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61  >prereq, pTempla
12310 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20  te->rRun,.      
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
12340 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a  emplate->nOut);.
12350 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12360 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
12370 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12380 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
12390 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
123a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
123b0 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
123c0 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
123d0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
123e0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
123f0 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
12400 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
12410 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  dif.    }.    re
12420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12430 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
12440 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
12450 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
12460 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
12470 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
12480 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
12490 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
124a0 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
124b0 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
124c0 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
124d0 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
124e0 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
124f0 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
12500 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
12510 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
12520 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
12530 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
12540 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
12550 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
12560 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
12570 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12580 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
12590 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
125a0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
125b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
125c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
125d0 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20   skip: ");.     
125e0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
125f0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
12600 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
12610 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
12620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
12630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
12640 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
12650 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
12660 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
12670 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
12680 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
12690 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
126a0 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
126b0 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
126c0 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
126d0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
126e0 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
126f0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
12700 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
12710 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
12720 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
12730 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
12740 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
12750 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
12760 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12770 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20  replace: ");.   
12780 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
12790 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
127a0 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  WC);.    }.    s
127b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
127c0 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a  f("    add: ");.
127d0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
127e0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
127f0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
12800 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
12810 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  ==0 ){.    /* Al
12820 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
12830 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f  reLoop to add to
12840 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
12850 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50  list */.    *ppP
12860 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65  rev = p = sqlite
12870 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
12880 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  b, sizeof(WhereL
12890 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70  oop));.    if( p
128a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
128b0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
128c0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69      whereLoopIni
128d0 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65  t(p);.    p->pNe
128e0 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65  xtLoop = 0;.  }e
128f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77  lse{.    /* We w
12900 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69  ill be overwriti
12910 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d  ng WhereLoop p[]
12920 2e 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65  .  But before we
12930 20 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a   do, first.    *
12940 2a 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65  * go through the
12950 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73   rest of the lis
12960 74 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79  t and delete any
12970 20 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62   other entries b
12980 65 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b  esides.    ** p[
12990 5d 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  ] that are also 
129a0 73 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65  supplated by pTe
129b0 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68  mplate */.    Wh
129c0 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c  ereLoop **ppTail
129d0 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70   = &p->pNextLoop
129e0 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  ;.    WhereLoop 
129f0 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69  *pToDel;.    whi
12a00 6c 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20  le( *ppTail ){. 
12a10 20 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68       ppTail = wh
12a20 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
12a30 72 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c  r(ppTail, pTempl
12a40 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
12a50 70 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61  ppTail==0 ) brea
12a60 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20  k;.      pToDel 
12a70 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20  = *ppTail;.     
12a80 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29   if( pToDel==0 )
12a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70   break;.      *p
12aa0 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e  pTail = pToDel->
12ab0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57  pNextLoop;.#if W
12ac0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
12ad0 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
12ae0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
12af0 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
12b00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12b10 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 64 65  DebugPrintf(" de
12b20 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20  lete: ");.      
12b30 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12b40 28 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65  (pToDel, pBuilde
12b50 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d  r->pWC);.      }
12b60 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68  .#endif.      wh
12b70 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62  ereLoopDelete(db
12b80 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d  , pToDel);.    }
12b90 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72  .  }.  rc = wher
12ba0 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c  eLoopXfer(db, p,
12bb0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69   pTemplate);.  i
12bc0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
12bd0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
12be0 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49  BLE)==0 ){.    I
12bf0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
12c00 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
12c10 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
12c20 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d   && pIndex->tnum
12c30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
12c40 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
12c50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
12c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12c70 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57  .** Adjust the W
12c80 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61  hereLoop.nOut va
12c90 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  lue downward to 
12ca0 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d  account for term
12cb0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52  s of the.** WHER
12cc0 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65  E clause that re
12cd0 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70  ference the loop
12ce0 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
12cf0 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a  ot used by an.**
12d00 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72   index..*.** For
12d10 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c 61   every WHERE cla
12d20 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69 73  use term that is
12d30 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65   not used by the
12d40 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68   index.** and wh
12d50 69 63 68 20 68 61 73 20 61 20 74 72 75 74 68 20  ich has a truth 
12d60 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69  probability assi
12d70 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74  gned by one of t
12d80 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  he likelihood(),
12d90 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72  .** likely(), or
12da0 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20   unlikely() SQL 
12db0 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63  functions, reduc
12dc0 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
12dd0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74  number.** of out
12de0 70 75 74 20 72 6f 77 73 20 62 79 20 74 68 65 20  put rows by the 
12df0 70 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63  probability spec
12e00 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e  ified..**.** TUN
12e10 49 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20  ING:  For every 
12e20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12e30 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73  m that is not us
12e40 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a  ed by the index.
12e50 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65  ** and which doe
12e60 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73  s not have an as
12e70 73 69 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f  signed truth pro
12e80 62 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73  bability, heuris
12e90 74 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65  tics.** describe
12ea0 64 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64  d below are used
12eb0 20 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d   to try to estim
12ec0 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70 72  ate the truth pr
12ed0 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f  obability..** TO
12ee0 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74  DO --> Perhaps t
12ef0 68 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  his is something
12f00 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69   that could be i
12f10 6d 70 72 6f 76 65 64 20 62 79 20 62 65 74 74 65  mproved by bette
12f20 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69  r.** table stati
12f30 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75  stics..**.** Heu
12f40 72 69 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d  ristic 1:  Estim
12f50 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70 72  ate the truth pr
12f60 6f 62 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e  obability as 93.
12f70 37 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25  75%.  The 93.75%
12f80 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73  .** value corres
12f90 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c  ponds to -1 in L
12fa0 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20  ogEst notation, 
12fb0 73 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65  so this means de
12fc0 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57  crement.** the W
12fd0 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69  hereLoop.nOut fi
12fe0 65 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73 75  eld for every su
12ff0 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
13000 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72  term..**.** Heur
13010 69 73 74 69 63 20 32 3a 20 20 49 66 20 74 68 65  istic 2:  If the
13020 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72  re exists one or
13030 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75   more WHERE clau
13040 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  se terms of the.
13050 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52  ** form "x==EXPR
13060 22 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f  " and EXPR is no
13070 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f  t a constant 0 o
13080 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  r 1, then make s
13090 75 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c  ure the.** final
130a0 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69   output row esti
130b0 6d 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74  mate is no great
130c0 65 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74  er than 1/4 of t
130d0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a  he total number.
130e0 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  ** of rows in th
130f0 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68  e table.  In oth
13100 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65  er words, assume
13110 20 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69   that x==EXPR wi
13120 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74  ll filter.** out
13130 20 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20   at least 3 out 
13140 6f 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45  of 4 rows.  If E
13150 58 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f  XPR is -1 or 0 o
13160 72 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  r 1, then maybe 
13170 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d  the.** "x" colum
13180 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20  n is boolean or 
13190 65 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20  else -1 or 0 or 
131a0 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65  1 is a common de
131b0 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f  fault value.** o
131c0 6e 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e  n the "x" column
131d0 20 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20   and so in that 
131e0 63 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68  case only cap th
131f0 65 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74  e output row est
13200 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20  imate.** at 1/2 
13210 69 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a  instead of 1/4..
13220 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
13230 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
13240 6a 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61  just(.  WhereCla
13250 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f  use *pWC,      /
13260 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
13270 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  se */.  WhereLoo
13280 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f  p *pLoop,      /
13290 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64  * The loop to ad
132a0 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f  just downward */
132b0 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20  .  LogEst nRow  
132c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
132d0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
132e0 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20  he entire table 
132f0 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
13300 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20  m *pTerm, *pX;. 
13310 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f   Bitmask notAllo
13320 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70  wed = ~(pLoop->p
13330 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73  rereq|pLoop->mas
13340 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c  kSelf);.  int i,
13350 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20   j, k;.  LogEst 
13360 69 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20  iReduce = 0;    
13370 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73  /* pLoop->nOut s
13380 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64  hould not exceed
13390 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f   nRow-iReduce */
133a0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f  ..  assert( (pLo
133b0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
133c0 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d  ERE_AUTO_INDEX)=
133d0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  =0 );.  for(i=pW
133e0 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d  C->nTerm, pTerm=
133f0 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  pWC->a; i>0; i--
13400 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
13410 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
13420 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
13430 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  AL)!=0 ) break;.
13440 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
13450 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
13460 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20  p->maskSelf)==0 
13470 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13480 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
13490 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77  eqAll & notAllow
134a0 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ed)!=0 ) continu
134b0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f  e;.    for(j=pLo
134c0 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  op->nLTerm-1; j>
134d0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
134e0 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
134f0 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rm[j];.      if(
13500 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75   pX==0 ) continu
13510 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  e;.      if( pX=
13520 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a  =pTerm ) break;.
13530 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50        if( pX->iP
13540 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57  arent>=0 && (&pW
13550 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74  C->a[pX->iParent
13560 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61  ])==pTerm ) brea
13570 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13580 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66   j<0 ){.      if
13590 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
135a0 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ob<=0 ){.       
135b0 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20 70   /* If a truth p
135c0 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73 70  robability is sp
135d0 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74 68  ecified using th
135e0 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68  e likelihood() h
135f0 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ints,.        **
13600 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70 72   then use the pr
13610 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64  obability provid
13620 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  ed by the applic
13630 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
13640 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d    pLoop->nOut +=
13650 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
13660 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  b;.      }else{.
13670 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
13680 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70  e absence of exp
13690 6c 69 63 69 74 20 74 72 75 74 68 20 70 72 6f 62  licit truth prob
136a0 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68  abilities, use h
136b0 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20  euristics to.   
136c0 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20       ** guess a 
136d0 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68  reasonable truth
136e0 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f   probability. */
136f0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
13700 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
13710 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
13720 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49  ator&(WO_EQ|WO_I
13730 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  S) ){.          
13740 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
13750 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
13760 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  ght;.          t
13770 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
13780 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
13790 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
137a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
137b0 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c 20 26  nteger(pRight, &
137c0 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26  k) && k>=(-1) &&
137d0 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   k<=1 ){.       
137e0 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20       k = 10;.   
137f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13800 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30            k = 20
13810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13820 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65 64          if( iRed
13830 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20  uce<k ) iReduce 
13840 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = k;.        }. 
13850 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13860 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f  .  if( pLoop->nO
13870 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63  ut > nRow-iReduc
13880 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74  e )  pLoop->nOut
13890 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63   = nRow - iReduc
138a0 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72  e;.}../* .** Ter
138b0 6d 20 70 54 65 72 6d 20 69 73 20 61 20 76 65 63  m pTerm is a vec
138c0 74 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72  tor range compar
138d0 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  ison operation. 
138e0 54 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72  The first compar
138f0 69 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76  ison.** in the v
13900 65 63 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74  ector can be opt
13910 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c  imized using col
13920 75 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69  umn nEq of the i
13930 6e 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ndex. This.** fu
13940 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
13950 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
13960 6f 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e  of vector elemen
13970 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ts that can be u
13980 73 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  sed.** as part o
13990 66 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6d 70  f the range comp
139a0 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  arison..**.** Fo
139b0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
139c0 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
139d0 2a 20 20 20 57 48 45 52 45 20 61 20 3d 20 3f 20  *   WHERE a = ? 
139e0 41 4e 44 20 28 62 2c 20 63 2c 20 64 29 20 3e 20  AND (b, c, d) > 
139f0 28 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20  (?, ?, ?).**.** 
13a00 61 6e 64 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a  and the index:.*
13a10 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  *.**   CREATE IN
13a20 44 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62  DEX ... ON (a, b
13a30 2c 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a  , c, d, e).**.**
13a40 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
13a50 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e 76  ion would be inv
13a60 6f 6b 65 64 20 77 69 74 68 20 6e 45 71 3d 31 2e  oked with nEq=1.
13a70 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
13a80 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63  ned in.** this c
13a90 61 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61  ase is 3..*/.sta
13aa0 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
13ab0 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50  geVectorLen(.  P
13ac0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13ad0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
13ae0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
13af0 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
13b00 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
13b10 6f 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  on pIdx */.  Ind
13b20 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
13b30 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
13b40 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  o be used for a 
13b50 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
13b60 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  raint */.  int n
13b70 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq,             
13b80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69  /* Number of pri
13b90 6f 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  or equality cons
13ba0 74 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20  traints on same 
13bb0 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
13bc0 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20  Term *pTerm     
13bd0 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 20 69 6e  /* The vector in
13be0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
13bf0 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  int */.){.  int 
13c00 6e 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78  nCmp = sqlite3Ex
13c10 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65  prVectorSize(pTe
13c20 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
13c30 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  );.  int i;..  n
13c40 43 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20  Cmp = MIN(nCmp, 
13c50 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d  (pIdx->nColumn -
13c60 20 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d   nEq));.  for(i=
13c70 31 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b  1; i<nCmp; i++){
13c80 0a 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20  .    /* Test if 
13c90 63 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20  comparison i of 
13ca0 70 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69  pTerm is compati
13cb0 62 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20  ble with column 
13cc0 28 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20  (i+nEq) .    ** 
13cd0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66  of the index. If
13ce0 20 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c   not, exit the l
13cf0 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61  oop.  */.    cha
13d00 72 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20  r aff;          
13d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13d20 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74  mparison affinit
13d30 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64  y */.    char id
13d40 78 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  xaff = 0;       
13d50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65         /* Indexe
13d60 64 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  d columns affini
13d70 74 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ty */.    CollSe
13d80 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
13d90 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
13da0 72 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20  rison collation 
13db0 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  sequence */.    
13dc0 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65  Expr *pLhs = pTe
13dd0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
13de0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
13df0 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
13e00 2a 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70  *pRhs = pTerm->p
13e10 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
13e20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
13e30 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
13e40 20 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d   ){.      pRhs =
13e50 20 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74   pRhs->x.pSelect
13e60 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
13e70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Expr;.    }else{
13e80 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52  .      pRhs = pR
13e90 68 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  hs->x.pList->a[i
13ea0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a  ].pExpr;.    }..
13eb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
13ec0 74 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  t the LHS of the
13ed0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61   comparison is a
13ee0 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
13ef0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
13f00 72 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  right column of 
13f10 74 68 65 20 72 69 67 68 74 20 73 6f 75 72 63 65  the right source
13f20 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 68 61 74   table. And that
13f30 20 74 68 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a   the sort.    **
13f40 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e   order of the in
13f50 64 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68  dex column is th
13f60 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 6f  e same as the so
13f70 72 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0a  rt order of the.
13f80 20 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20      ** leftmost 
13f90 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a  index column.  *
13fa0 2f 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e  /.    if( pLhs->
13fb0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20  op!=TK_COLUMN . 
13fc0 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61      || pLhs->iTa
13fd0 62 6c 65 21 3d 69 43 75 72 20 0a 20 20 20 20 20  ble!=iCur .     
13fe0 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e  || pLhs->iColumn
13ff0 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  !=pIdx->aiColumn
14000 5b 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c  [i+nEq] .     ||
14010 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
14020 72 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e  r[i+nEq]!=pIdx->
14030 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a  aSortOrder[nEq].
14040 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
14050 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  ak;.    }..    t
14060 65 73 74 63 61 73 65 28 20 70 4c 68 73 2d 3e 69  estcase( pLhs->i
14070 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44  Column==XN_ROWID
14080 20 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   );.    aff = sq
14090 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
140a0 6e 69 74 79 28 70 52 68 73 2c 20 73 71 6c 69 74  nity(pRhs, sqlit
140b0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
140c0 4c 68 73 29 29 3b 0a 20 20 20 20 69 64 78 61 66  Lhs));.    idxaf
140d0 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
140e0 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
140f0 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68  Idx->pTable, pLh
14100 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  s->iColumn);.   
14110 20 69 66 28 20 61 66 66 21 3d 69 64 78 61 66 66   if( aff!=idxaff
14120 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70   ) break;..    p
14130 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
14140 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
14150 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  eq(pParse, pLhs,
14160 20 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20   pRhs);.    if( 
14170 70 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b  pColl==0 ) break
14180 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14190 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
141a0 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
141b0 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72  oll[i+nEq]) ) br
141c0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
141d0 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n i;.}../*.** Ad
141e0 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20  just the cost C 
141f0 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20  by the costMult 
14200 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20  facter T.  This 
14210 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a  only occurs if.*
14220 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  * compiled with 
14230 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  -DSQLITE_ENABLE_
14240 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64  COSTMULT.*/.#ifd
14250 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14260 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69  _COSTMULT.# defi
14270 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74  ne ApplyCostMult
14280 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b  iplier(C,T)  C +
14290 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  = T.#else.# defi
142a0 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74  ne ApplyCostMult
142b0 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64  iplier(C,T).#end
142c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76  if../*.** We hav
142d0 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64  e so far matched
142e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
142f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72  >u.btree.nEq ter
14300 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  ms of the .** in
14310 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20  dex pIndex. Try 
14320 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
14330 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  e..**.** When th
14340 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14350 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d  alled, pBuilder-
14360 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74  >pNew->nOut cont
14370 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d  ains the .** num
14380 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
14390 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  cted to be visit
143a0 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20  ed by filtering 
143b0 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a  using the nEq .*
143c0 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66  * terms only. If
143d0 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c   it is modified,
143e0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72   this value is r
143f0 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74  estored before t
14400 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
14410 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
14420 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d  If pProbe->tnum=
14430 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70  =0, that means p
14440 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20  Index is a fake 
14450 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74  index used for t
14460 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
14470 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74  IMARY KEY..*/.st
14480 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
14490 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
144a0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
144b0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20  der *pBuilder,  
144c0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
144d0 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20  oop factory */. 
144e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
144f0 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
14500 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
14510 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
14520 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  zed */.  Index *
14530 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20  pProbe,         
14540 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
14550 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a  ndex on pSrc */.
14560 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20    LogEst nInMul 
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20    /* log(Number 
14590 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75  of iterations du
145a0 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20  e to IN) */.){. 
145b0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
145c0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
145d0 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45  WInfo;  /* WHERE
145e0 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74   analyse context
145f0 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
14600 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
14610 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  arse;        /* 
14620 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
14630 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14640 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
14650 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
14660 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c   connection mall
14670 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  oc context */.  
14680 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
146b0 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73  eLoop under cons
146c0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  truction */.  Wh
146d0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146f0 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64   A WhereTerm und
14700 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
14710 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b   */.  int opMask
14720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14730 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f        /* Valid o
14740 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e  perators for con
14750 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68  straints */.  Wh
14760 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20  ereScan scan;   
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14780 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48   Iterator for WH
14790 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42  ERE terms */.  B
147a0 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65  itmask saved_pre
147b0 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f  req;           /
147c0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
147d0 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71   of pNew->prereq
147e0 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
147f0 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
14800 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
14810 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
14820 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36  >nLTerm */.  u16
14830 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20   saved_nEq;     
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14850 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
14860 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
14870 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  nEq */.  u16 sav
14880 65 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20 20  ed_nBtm;        
14890 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
148a0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
148b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
148c0 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
148d0 6e 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  nTop;           
148e0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
148f0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
14900 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f  >u.btree.nTop */
14910 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b  .  u16 saved_nSk
14920 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
14930 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
14940 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53  alue of pNew->nS
14950 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76  kip */.  u32 sav
14960 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20  ed_wsFlags;     
14970 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
14980 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
14990 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20  ew->wsFlags */. 
149a0 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f   LogEst saved_nO
149b0 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
149c0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
149d0 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
149e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
149f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
14a00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14a10 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  code */.  LogEst
14a20 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   rSize;         
14a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14a40 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
14a50 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
14a60 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a80 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61   Logarithm of ta
14a90 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68  ble size */.  Wh
14aa0 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20  ereTerm *pTop = 
14ab0 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a  0, *pBtm = 0; /*
14ac0 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   Top and bottom 
14ad0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
14ae0 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70  s */..  pNew = p
14af0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
14b00 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14b10 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
14b20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14b30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
14b40 78 38 30 30 2c 20 28 22 42 45 47 49 4e 20 61 64  x800, ("BEGIN ad
14b50 64 42 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e  dBtreeIdx(%s), n
14b60 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  Eq=%d\n",.      
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14b80 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  Probe->zName, pN
14b90 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29  ew->u.btree.nEq)
14ba0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  );..  assert( (p
14bb0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
14bc0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
14bd0 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  E)==0 );.  asser
14be0 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
14bf0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
14c00 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  MIT)==0 );.  if(
14c10 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
14c20 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
14c30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
14c40 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_LT|WO_LE;.  
14c50 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
14c60 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
14c70 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20 20  .nBtm==0 );.    
14c80 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  opMask = WO_EQ|W
14c90 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_IN|WO_GT|WO_GE
14ca0 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
14cb0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20  ISNULL|WO_IS;.  
14cc0 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  }.  if( pProbe->
14cd0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d  bUnordered ) opM
14ce0 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57  ask &= ~(WO_GT|W
14cf0 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
14d00 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  );..  assert( pN
14d10 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
14d20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
14d30 29 3b 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  );..  saved_nEq 
14d40 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
14d50 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42 74  nEq;.  saved_nBt
14d60 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  m = pNew->u.btre
14d70 65 2e 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64 5f  e.nBtm;.  saved_
14d80 6e 54 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  nTop = pNew->u.b
14d90 74 72 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61 76  tree.nTop;.  sav
14da0 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d  ed_nSkip = pNew-
14db0 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f  >nSkip;.  saved_
14dc0 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e  nLTerm = pNew->n
14dd0 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77  LTerm;.  saved_w
14de0 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77  sFlags = pNew->w
14df0 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f  sFlags;.  saved_
14e00 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70  prereq = pNew->p
14e10 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e  rereq;.  saved_n
14e20 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out = pNew->nOut
14e30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72  ;.  pTerm = wher
14e40 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
14e50 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20   pBuilder->pWC, 
14e60 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73  pSrc->iCursor, s
14e70 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20  aved_nEq,.      
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65    opMask, pProbe
14ea0 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  );.  pNew->rSetu
14eb0 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d  p = 0;.  rSize =
14ec0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
14ed0 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53  gEst[0];.  rLogS
14ee0 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69  ize = estLog(rSi
14ef0 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d  ze);.  for(; rc=
14f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54  =SQLITE_OK && pT
14f10 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20  erm!=0; pTerm = 
14f20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73  whereScanNext(&s
14f30 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65  can)){.    u16 e
14f40 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65  Op = pTerm->eOpe
14f50 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72  rator;   /* Shor
14f60 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d  thand for pTerm-
14f70 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  >eOperator */.  
14f80 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64    LogEst rCostId
14f90 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f  x;.    LogEst nO
14fa0 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20  utUnadjusted;   
14fb0 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66       /* nOut bef
14fc0 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45  ore IN() and WHE
14fd0 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a  RE adjustments *
14fe0 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20  /.    int nIn = 
14ff0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
15000 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
15010 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e  _STAT4.    int n
15020 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c  RecValid = pBuil
15030 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a  der->nRecValid;.
15040 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
15050 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c  eOp==WO_ISNULL |
15060 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  | (pTerm->wtFlag
15070 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30  s&TERM_VNULL)!=0
15080 29 0a 20 20 20 20 20 26 26 20 69 6e 64 65 78 43  ).     && indexC
15090 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72  olumnNotNull(pPr
150a0 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a  obe, saved_nEq).
150b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
150c0 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65  tinue; /* ignore
150d0 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63   IS [NOT] NULL c
150e0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f  onstraints on NO
150f0 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
15100 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
15110 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
15120 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  ht & pNew->maskS
15130 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  elf ) continue;.
15140 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  .    /* Do not a
15150 6c 6c 6f 77 20 74 68 65 20 75 70 70 65 72 20 62  llow the upper b
15160 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f  ound of a LIKE o
15170 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67  ptimization rang
15180 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  e constraint.   
15190 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20   ** to mix with 
151a0 61 20 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f  a lower range bo
151b0 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74  und from some ot
151c0 68 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20  her source */.  
151d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
151e0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
151f0 4f 50 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f  OPT && pTerm->eO
15200 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29  perator==WO_LT )
15210 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
15220 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
15230 49 53 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IS constraints f
15240 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63 6c  rom the WHERE cl
15250 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64 20  ause to be used 
15260 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 69  by the.    ** ri
15270 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
15280 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20  EFT JOIN.  Only 
15290 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
152a0 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 61 72 65  he ON clause are
152b0 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 20  .    ** allowed 
152c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 72 63  */.    if( (pSrc
152d0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
152e0 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20  JT_LEFT)!=0.    
152f0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
15300 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
15310 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
15320 20 20 20 20 20 26 26 20 28 65 4f 70 20 26 20 28       && (eOp & (
15330 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_IS|WO_ISNULL)
15340 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
15350 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
15360 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
15370 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
15380 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
15390 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
153a0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 49 73 55    }..    if( IsU
153b0 6e 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62  niqueIndex(pProb
153c0 65 29 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d  e) && saved_nEq=
153d0 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
153e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 70 42 75 69  -1 ){.      pBui
153f0 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c  lder->bldFlags |
15400 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55 4e  = SQLITE_BLDF_UN
15410 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  IQUE;.    }else{
15420 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d  .      pBuilder-
15430 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c  >bldFlags |= SQL
15440 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44  ITE_BLDF_INDEXED
15450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
15460 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
15470 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
15480 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
15490 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
154a0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
154b0 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74  nBtm = saved_nBt
154c0 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  m;.    pNew->u.b
154d0 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65  tree.nTop = save
154e0 64 5f 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77  d_nTop;.    pNew
154f0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
15500 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
15510 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
15520 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
15530 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
15540 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
15550 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
15560 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
15570 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
15580 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
15590 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
155a0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
155b0 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
155c0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
155d0 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
155e0 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
155f0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
15600 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
15610 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
15620 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
15630 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
15640 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
15650 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
15660 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
15670 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
15680 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
15690 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
156a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
156b0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
156c0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
156d0 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
156e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
156f0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
15700 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
15710 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
15720 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
15730 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
15740 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
15750 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
15760 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20        nIn = 46; 
15770 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c   assert( 46==sql
15780 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29  ite3LogEst(25) )
15790 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
157a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 79  e expression may
157b0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6f 66 20   actually be of 
157c0 74 68 65 20 66 6f 72 6d 20 28 78 2c 20 79 29 20  the form (x, y) 
157d0 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 2e 0a  IN (SELECT...)..
157e0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
157f0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
15800 20 61 20 73 65 70 61 72 61 74 65 20 74 65 72 6d   a separate term
15810 20 66 6f 72 20 65 61 63 68 20 6f 66 20 28 78 29   for each of (x)
15820 20 61 6e 64 20 28 79 29 2e 0a 20 20 20 20 20 20   and (y)..      
15830 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
15840 65 20 6e 49 6e 20 6d 75 6c 74 69 70 6c 69 65 72  e nIn multiplier
15850 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
15860 61 70 70 6c 69 65 64 20 6f 6e 63 65 2c 20 6e 6f  applied once, no
15870 74 20 6f 6e 63 65 0a 20 20 20 20 20 20 20 20 2a  t once.        *
15880 2a 20 66 6f 72 20 65 61 63 68 20 73 75 63 68 20  * for each such 
15890 74 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  term. The follow
158a0 69 6e 67 20 6c 6f 6f 70 20 63 68 65 63 6b 73 20  ing loop checks 
158b0 74 68 61 74 20 70 54 65 72 6d 20 69 73 20 74 68  that pTerm is th
158c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72  e.        ** fir
158d0 73 74 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20  st such term in 
158e0 75 73 65 2c 20 61 6e 64 20 73 65 74 73 20 6e 49  use, and sets nI
158f0 6e 20 62 61 63 6b 20 74 6f 20 30 20 69 66 20 69  n back to 0 if i
15900 74 20 69 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  t is not. */.   
15910 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15920 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  pNew->nLTerm-1; 
15930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15940 69 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  if( pNew->aLTerm
15950 5b 69 5d 20 26 26 20 70 4e 65 77 2d 3e 61 4c 54  [i] && pNew->aLT
15960 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70  erm[i]->pExpr==p
15970 45 78 70 72 20 29 20 6e 49 6e 20 3d 20 30 3b 0a  Expr ) nIn = 0;.
15980 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15990 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
159a0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  (pExpr->x.pList 
159b0 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
159c0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
159d0 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
159e0 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
159f0 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  )" */.        nI
15a00 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
15a10 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
15a20 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
15a30 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20    assert( nIn>0 
15a40 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79  );  /* RHS alway
15a50 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20  s has 2 or more 
15a60 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61  terms...  The pa
15a70 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  rser.           
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
15a90 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20  * changes "x IN 
15aa0 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e  (?)" into "x=?".
15ab0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
15ac0 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
15ad0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
15ae0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
15af0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
15b00 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20  mn[saved_nEq];. 
15b10 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
15b20 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
15b30 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73  MN_EQ;.      ass
15b40 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d  ert( saved_nEq==
15b50 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
15b60 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  q );.      if( i
15b70 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20  Col==XN_ROWID . 
15b80 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 30        || (iCol>0
15b90 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26   && nInMul==0 &&
15ba0 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f   saved_nEq==pPro
15bb0 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20  be->nKeyCol-1). 
15bc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
15bd0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70  if( iCol>=0 && p
15be0 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Probe->uniqNotNu
15bf0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
15c00 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
15c10 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41   |= WHERE_UNQ_WA
15c20 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  NTED;.        }e
15c30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
15c40 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15c50 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
15c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15c70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
15c80 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  p & WO_ISNULL ){
15c90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
15ca0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
15cb0 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  LUMN_NULL;.    }
15cc0 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
15cd0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
15ce0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15cf0 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20  eOp & WO_GT );. 
15d00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
15d10 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  Op & WO_GE );.  
15d20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
15d30 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
15d40 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54  N_RANGE|WHERE_BT
15d50 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  M_LIMIT;.      p
15d60 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
15d70 6d 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65  m = whereRangeVe
15d80 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20  ctorLen(.       
15d90 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d     pParse, pSrc-
15da0 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65  >iCursor, pProbe
15db0 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65  , saved_nEq, pTe
15dc0 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  rm.      );.    
15dd0 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a    pBtm = pTerm;.
15de0 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a        pTop = 0;.
15df0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
15e00 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
15e10 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20  LIKEOPT ){.     
15e20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74     /* Range cont
15e30 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65  raints that come
15e40 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f   from the LIKE o
15e50 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a  ptimization are.
15e60 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
15e70 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e  s used in pairs.
15e80 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70   */.        pTop
15e90 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20   = &pTerm[1];.  
15ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
15eb0 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d  Top-(pTerm->pWC-
15ec0 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d  >a))<pTerm->pWC-
15ed0 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  >nTerm );.      
15ee0 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e    assert( pTop->
15ef0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
15f00 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20  IKEOPT );.      
15f10 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e    assert( pTop->
15f20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54  eOperator==WO_LT
15f30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
15f40 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
15f50 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
15f60 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61  nLTerm+1) ) brea
15f70 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20  k; /* OOM */.   
15f80 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
15f90 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
15fa0 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20  ] = pTop;.      
15fb0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
15fc0 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
15fd0 49 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  IT;.        pNew
15fe0 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
15ff0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
16000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
16010 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c  ert( eOp & (WO_L
16020 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20  T|WO_LE) );.    
16030 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
16040 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  & WO_LT );.     
16050 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
16060 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20   WO_LE );.      
16070 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
16080 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
16090 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  NGE|WHERE_TOP_LI
160a0 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  MIT;.      pNew-
160b0 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
160c0 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72  whereRangeVector
160d0 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  Len(.          p
160e0 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75  Parse, pSrc->iCu
160f0 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61  rsor, pProbe, sa
16100 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20  ved_nEq, pTerm. 
16110 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 54       );.      pT
16120 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  op = pTerm;.    
16130 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e    pBtm = (pNew->
16140 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16150 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a  BTM_LIMIT)!=0 ?.
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
16180 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32  m[pNew->nLTerm-2
16190 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  ] : 0;.    }..  
161a0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
161b0 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73  nt pNew->nOut is
161c0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
161d0 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63  er of rows expec
161e0 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  ted to.    ** be
161f0 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
16200 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72  index scan befor
16210 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65  e considering te
16220 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65  rm pTerm, or the
16230 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f  .    ** values o
16240 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nIn and nInMul
16250 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
16260 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
16270 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  all .    ** "x I
16280 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72  N(...)" terms ar
16290 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20  e replaced with 
162a0 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c  "x = ?". This bl
162b0 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20  ock updates.    
162c0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
162d0 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63  pNew->nOut to ac
162e0 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20  count for pTerm 
162f0 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e  (but not nIn/nIn
16300 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73  Mul).  */.    as
16310 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
16320 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
16330 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
16340 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
16350 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
16360 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f      /* Adjust nO
16370 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73  ut using stat3/s
16380 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69  tat4 data. Or, i
16390 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
163a0 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20  at3/stat4.      
163b0 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73  ** data, using s
163c0 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61  ome other estima
163d0 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68  te.  */.      wh
163e0 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
163f0 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
16400 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e  , pBtm, pTop, pN
16410 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ew);.    }else{.
16420 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
16430 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ++pNew->u.btree.
16440 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nEq;.      asser
16450 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e  t( eOp & (WO_ISN
16460 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  ULL|WO_EQ|WO_IN|
16470 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20  WO_IS) );..     
16480 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
16490 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20  Out==saved_nOut 
164a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
164b0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
164c0 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f   && pProbe->aiCo
164d0 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e  lumn[saved_nEq]>
164e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
164f0 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f  sert( (eOp & WO_
16500 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b  IN) || nIn==0 );
16510 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
16520 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29  e( eOp & WO_IN )
16530 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
16540 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  nOut += pTerm->t
16550 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
16560 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
16570 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nIn;.      }else
16580 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
16590 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
165a0 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74 52  STAT4.        tR
165b0 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a  owcnt nOut = 0;.
165c0 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d          if( nInM
165d0 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ul==0 .         
165e0 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  && pProbe->nSamp
165f0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  le .         && 
16600 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
16610 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70  q<=pProbe->nSamp
16620 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26  leCol.         &
16630 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  & ((eOp & WO_IN)
16640 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50  ==0 || !ExprHasP
16650 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
16660 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16670 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ct)).        ){.
16680 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
16690 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
166a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
166b0 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45  if( (eOp & (WO_E
166c0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  Q|WO_ISNULL|WO_I
166d0 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
166e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
166f0 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  eOp & WO_EQ );. 
16700 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
16710 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53  ase( eOp & WO_IS
16720 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16730 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
16740 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
16750 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
16760 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
16770 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
16780 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16790 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
167a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
167b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
167c0 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
167d0 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
167e0 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
167f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
16800 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
16810 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
16820 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
16830 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OK;.          if
16840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16850 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20  ) break;        
16860 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66    /* Jump out of
16870 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20   the pTerm loop 
16880 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
16890 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20   nOut ){.       
168a0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
168b0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
168c0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
168d0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75     if( pNew->nOu
168e0 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70  t>saved_nOut ) p
168f0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
16900 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  d_nOut;.        
16910 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
16920 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20  = nIn;.         
16930 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
16940 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30       if( nOut==0
16950 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
16960 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e    {.          pN
16970 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72  ew->nOut += (pPr
16980 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
16990 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  [nEq] - pProbe->
169a0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d  aiRowLogEst[nEq-
169b0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1]);.          i
169c0 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
169d0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
169e0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
169f0 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65  there is no like
16a00 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20  lihood() value, 
16a10 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20  assume that a . 
16a20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63             ** "c
16a30 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72  ol IS NULL" expr
16a40 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
16a50 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77  wice as many row
16a60 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s .            *
16a70 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f  * as (col=?). */
16a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
16a90 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20  w->nOut += 10;. 
16aa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16ab0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16ac0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72   }..    /* Set r
16ad0 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63  CostIdx to the c
16ae0 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
16af0 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e  selected rows in
16b00 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20   index. Add.    
16b10 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72  ** it to pNew->r
16b20 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75  Run, which is cu
16b30 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
16b40 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69  he cost of the i
16b50 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ndex.    ** seek
16b60 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20   only. Then, if 
16b70 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
16b80 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64  vering index, ad
16b90 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20  d the cost of.  
16ba0 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68    ** visiting th
16bb0 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  e rows in the ma
16bc0 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  in table.  */.  
16bd0 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65    rCostIdx = pNe
16be0 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31  w->nOut + 1 + (1
16bf0 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
16c00 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ow)/pSrc->pTab->
16c10 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e  szTabRow;.    pN
16c20 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
16c30 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
16c40 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b  Size, rCostIdx);
16c50 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
16c60 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
16c70 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
16c80 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  IPK))==0 ){.    
16c90 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
16ca0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
16cb0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
16cc0 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20  ->nOut + 16);.  
16cd0 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73    }.    ApplyCos
16ce0 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
16cf0 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e  ->rRun, pProbe->
16d00 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74  pTable->costMult
16d10 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64  );..    nOutUnad
16d20 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e  justed = pNew->n
16d30 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Out;.    pNew->r
16d40 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Run += nInMul + 
16d50 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nIn;.    pNew->n
16d60 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Out += nInMul + 
16d70 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  nIn;.    whereLo
16d80 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
16d90 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e  Builder->pWC, pN
16da0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
16db0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
16dc0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
16dd0 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
16de0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
16df0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
16e00 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E ){.      pNew-
16e10 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
16e20 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
16e30 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
16e40 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  = nOutUnadjusted
16e50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
16e60 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
16e70 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
16e80 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
16e90 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
16ea0 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a  pProbe->nColumn.
16eb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65      ){.      whe
16ec0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
16ed0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
16ee0 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d  rc, pProbe, nInM
16ef0 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  ul+nIn);.    }. 
16f00 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
16f10 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64  saved_nOut;.#ifd
16f20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16f30 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
16f40 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
16f50 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
16f60 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
16f70 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
16f80 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
16f90 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16fa0 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
16fb0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
16fc0 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74  nBtm = saved_nBt
16fd0 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  m;.  pNew->u.btr
16fe0 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f  ee.nTop = saved_
16ff0 6e 54 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  nTop;.  pNew->nS
17000 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
17010 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  p;.  pNew->wsFla
17020 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
17030 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  gs;.  pNew->nOut
17040 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
17050 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
17060 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20  saved_nLTerm;.. 
17070 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69   /* Consider usi
17080 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69  ng a skip-scan i
17090 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  f there are no W
170a0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
170b0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61  traints.  ** ava
170c0 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c  ilable for the l
170d0 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f  eft-most terms o
170e0 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64  f the index, and
170f0 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65 0a   if the average.
17100 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    ** number of r
17110 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65  epeats in the le
17120 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73  ft-most terms is
17130 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20   at least 18. . 
17140 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67   **.  ** The mag
17150 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20  ic number 18 is 
17160 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20  selected on the 
17170 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e  basis that scann
17180 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a  ing 17 rows.  **
17190 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79   is almost alway
171a0 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61  s quicker than a
171b0 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76  n index seek (ev
171c0 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68 65  en though if the
171d0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74   index.  ** cont
171e0 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
171f0 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73 73  2^17 rows we ass
17200 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e  ume otherwise in
17210 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a   other parts of.
17220 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20    ** the code). 
17230 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20  And, even if it 
17240 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c  is not, it shoul
17250 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63  d not be too muc
17260 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20  h slower. .  ** 
17270 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
17280 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65 65  d, the extra see
17290 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20  ks could end up 
172a0 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e  being significan
172b0 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78  tly.  ** more ex
172c0 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61  pensive.  */.  a
172d0 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74  ssert( 42==sqlit
172e0 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a  e3LogEst(18) );.
172f0 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d    if( saved_nEq=
17300 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20  =saved_nSkip.   
17310 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70  && saved_nEq+1<p
17320 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20  Probe->nKeyCol. 
17330 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f 53    && pProbe->noS
17340 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26 26  kipScan==0.   &&
17350 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
17360 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31  gEst[saved_nEq+1
17370 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47  ]>=42  /* TUNING
17380 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b  : Minimum for sk
17390 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26  ip-scan */.   &&
173a0 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70   (rc = whereLoop
173b0 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
173c0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
173d0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )==SQLITE_OK.  )
173e0 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74  {.    LogEst nIt
173f0 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  er;.    pNew->u.
17400 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20  btree.nEq++;.   
17410 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a   pNew->nSkip++;.
17420 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
17430 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
17440 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
17450 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
17460 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e  _SKIPSCAN;.    n
17470 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Iter = pProbe->a
17480 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
17490 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  _nEq] - pProbe->
174a0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
174b0 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e  d_nEq+1];.    pN
174c0 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65  ew->nOut -= nIte
174d0 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  r;.    /* TUNING
174e0 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72  :  Because uncer
174f0 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20  tainties in the 
17500 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b  estimates for sk
17510 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c  ip-scan queries,
17520 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e  .    ** add a 1.
17530 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72  375 fudge factor
17540 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63   to make skip-sc
17550 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73  an slightly less
17560 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20   likely. */.    
17570 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20  nIter += 5;.    
17580 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
17590 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c  eIndex(pBuilder,
175a0 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e   pSrc, pProbe, n
175b0 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a  Iter + nInMul);.
175c0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
175d0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
175e0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
175f0 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
17600 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
17610 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20  = saved_nSkip;. 
17620 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
17630 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73   = saved_wsFlags
17640 3b 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45 54 52  ;.  }..  WHERETR
17650 41 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e 44  ACE(0x800, ("END
17660 20 61 64 64 42 74 72 65 65 49 64 78 28 25 73 29   addBtreeIdx(%s)
17670 2c 20 6e 45 71 3d 25 64 2c 20 72 63 3d 25 64 5c  , nEq=%d, rc=%d\
17680 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17690 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62 65            pProbe
176a0 2d 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f 6e  ->zName, saved_n
176b0 45 71 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75  Eq, rc));.  retu
176c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
176d0 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
176e0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
176f0 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
17700 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
17710 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
17720 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17730 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
17740 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
17750 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
17760 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
17770 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17780 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
17790 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
177a0 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
177b0 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
177c0 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
177d0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
177e0 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
177f0 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
17800 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
17810 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
17820 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
17830 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
17840 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
17850 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  pOB;.  ExprList 
17860 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74  *aColExpr;.  int
17870 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
17880 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
17890 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
178a0 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
178b0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
178c0 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
178d0 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
178e0 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
178f0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
17900 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
17910 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
17920 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
17930 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
17940 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
17950 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
17960 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le==iCursor ){. 
17970 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
17980 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
17990 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  rn 1;.      for(
179a0 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
179b0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
179c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
179d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
179e0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
179f0 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
17a00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
17a10 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20  if( (aColExpr = 
17a20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
17a30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
17a40 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
17a50 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
17a60 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
17a70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
17a80 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63  jj]!=XN_EXPR ) c
17a90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
17aa0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
17ab0 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 61 43  Compare(pExpr,aC
17ac0 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45  olExpr->a[jj].pE
17ad0 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20  xpr,iCursor)==0 
17ae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
17af0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
17b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
17b20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17b30 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
17b40 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
17b50 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
17b60 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
17b70 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
17b80 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
17b90 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
17ba0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
17bb0 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
17bc0 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
17bd0 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
17be0 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
17bf0 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
17c00 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
17c10 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
17c20 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
17c30 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
17c40 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
17c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
17c60 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
17c70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17c80 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
17c90 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
17ca0 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
17cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
17cc0 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
17cd0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
17ce0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
17cf0 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
17d00 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
17d10 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
17d20 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
17d30 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
17d40 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
17d50 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
17d60 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
17d70 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
17d80 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
17d90 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
17da0 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
17db0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
17dc0 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65  m;.  while( pWhe
17dd0 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
17de0 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65  {.    if( !where
17df0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
17e00 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65  ex(iTab,pWC,pWhe
17e10 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  re->pLeft) ) ret
17e20 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72  urn 0;.    pWher
17e30 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67  e = pWhere->pRig
17e40 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ht;.  }.  for(i=
17e50 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
17e60 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
17e70 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
17e80 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17e90 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
17ea0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
17eb0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 78  rImpliesExpr(pEx
17ec0 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
17ed0 29 20 0a 20 20 20 20 20 26 26 20 28 21 45 78 70  ) .     && (!Exp
17ee0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17ef0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
17f00 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
17f10 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62  tJoinTable==iTab
17f20 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
17f30 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
17f40 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
17f50 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
17f60 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
17f70 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
17f80 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
17f90 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
17fa0 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69 65  .** is identifie
17fb0 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
17fc0 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
17fd0 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
17fe0 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  teed to be.** a 
17ff0 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f  b-tree table, no
18000 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
18010 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73  e..**.** The cos
18020 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52  ts (WhereLoop.rR
18030 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65  un) of the b-tre
18040 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79  e loops added by
18050 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
18060 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  * are calculated
18070 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
18080 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63  ** For a full sc
18090 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65  an, assuming the
180a0 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78   table (or index
180b0 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20  ) contains nRow 
180c0 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rows:.**.**     
180d0 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e  cost = nRow * 3.
180e0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
180f0 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62       // full-tab
18100 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63  le scan.**     c
18110 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20  ost = nRow * K  
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63      // scan of c
18140 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
18150 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
18160 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20   * (K+3.0)      
18170 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61            // sca
18180 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  n of non-coverin
18190 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68  g index.**.** wh
181a0 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65  ere K is a value
181b0 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64   between 1.1 and
181c0 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f   3.0 set based o
181d0 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a  n the relative .
181e0 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76 65  ** estimated ave
181f0 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65  rage size of the
18200 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
18210 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
18220 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61  For an index sca
18230 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74 20  n, where nVisit 
18240 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
18250 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69   index rows visi
18260 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63  ted.** by the sc
18270 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73  an, and nSeek is
18280 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
18290 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  eek operations r
182a0 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74  equired on .** t
182b0 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a  he index b-tree:
182c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  .**.**     cost 
182d0 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e  = nSeek * (log(n
182e0 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69  Row) + K * nVisi
182f0 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63  t)          // c
18300 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
18310 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65       cost = nSee
18320 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b  k * (log(nRow) +
18330 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69   (K+3.0) * nVisi
18340 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76  t)    // non-cov
18350 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a  ering index.**.*
18360 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65  * Normally, nSee
18370 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61  k is 1. nSeek va
18380 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61  lues greater tha
18390 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69  n 1 come about i
183a0 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20  f the .** WHERE 
183b0 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20  clause includes 
183c0 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65  "x IN (....)" te
183d0 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63  rms used in plac
183e0 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77  e of "x=?". Or w
183f0 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74  hen .** implicit
18400 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78   "x IN (SELECT x
18410 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d   FROM tbl)" term
18420 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72 20  s are added for 
18430 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a  skip-scans..**.*
18440 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20  * The estimated 
18450 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56  values (nRow, nV
18460 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74  isit, nSeek) oft
18470 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72  en contain a lar
18480 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  ge amount.** of 
18490 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f  uncertainty.  Fo
184a0 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73  r this reason, s
184b0 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e  coring is design
184c0 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73  ed to pick plans
184d0 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65   that.** "do the
184e0 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66 20   least harm" if 
184f0 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61 72  the estimates ar
18500 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46  e inaccurate.  F
18510 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a  or example, a.**
18520 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f   log(nRow) facto
18530 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  r is omitted fro
18540 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  m a non-covering
18550 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f   index scan in o
18560 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20  rder to.** bias 
18570 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66  the scoring in f
18580 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e  avor of using an
18590 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68   index, since th
185a0 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20  e worst-case.** 
185b0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75  performance of u
185c0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73  sing an index is
185d0 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61 6e   far better than
185e0 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20   the worst-case 
185f0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f  performance.** o
18600 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
18610 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  can..*/.static i
18620 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  nt whereLoopAddB
18630 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tree(.  WhereLoo
18640 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
18650 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  er, /* WHERE cla
18660 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
18670 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  */.  Bitmask mPr
18680 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20 20  ereq            
18690 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65 71   /* Extra prereq
186a0 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e  uesites for usin
186b0 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
186c0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
186d0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
186e0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
186f0 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
18700 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20  Index *pProbe;  
18710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18720 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65  n index we are e
18730 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49  valuating */.  I
18740 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
18750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
18760 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
18770 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
18780 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  y key */.  LogEs
18790 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b  t aiRowEstPk[2];
187a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69         /* The ai
187b0 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75  RowLogEst[] valu
187c0 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
187d0 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43  dex */.  i16 aiC
187e0 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
187f0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
18800 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
18810 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
18820 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
18830 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
18840 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
18850 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
18860 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
18870 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ;  /* The FROM c
18880 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d  lause btree term
18890 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65   to add */.  Whe
188a0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
188b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
188c0 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  late WhereLoop o
188d0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
188e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
188f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18900 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
18910 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20  SortIdx = 1;    
18920 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18930 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
18940 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
18950 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f          /* A boo
18960 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  lean value */.  
18970 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20  LogEst rSize;   
18980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
18990 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
189a0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
189b0 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
189c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
189d0 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
189e0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
189f0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
18a00 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18a10 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
18a20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45  The parsed WHERE
18a30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62   clause */.  Tab
18a40 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
18a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
18a60 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
18a70 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70  */.  .  pNew = p
18a80 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
18a90 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
18aa0 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54  er->pWInfo;.  pT
18ab0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
18ac0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72  >pTabList;.  pSr
18ad0 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20  c = pTabList->a 
18ae0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
18af0 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
18b00 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c  b;.  pWC = pBuil
18b10 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65  der->pWC;.  asse
18b20 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
18b30 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20  Src->pTab) );.. 
18b40 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e   if( pSrc->pIBIn
18b50 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
18b60 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18b70 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
18b80 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
18b90 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
18ba0 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42  robe = pSrc->pIB
18bb0 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69  Index;.  }else i
18bc0 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
18bd0 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65  b) ){.    pProbe
18be0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
18bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18c00 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44   There is no IND
18c10 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
18c20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49   Create a fake I
18c30 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c  ndex object in l
18c40 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69  ocal.    ** vari
18c50 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72  able sPk to repr
18c60 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
18c70 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
18c80 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20  x.  Make this.  
18c90 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20    ** fake index 
18ca0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63  the first in a c
18cb0 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62  hain of Index ob
18cc0 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f  jects with all o
18cd0 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a  f the real.    *
18ce0 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c  * indices to fol
18cf0 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  low */.    Index
18d00 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
18d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18d20 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69  rst of real indi
18d30 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
18d40 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
18d50 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49  sPk, 0, sizeof(I
18d60 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e  ndex));.    sPk.
18d70 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  nKeyCol = 1;.   
18d80 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
18d90 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
18da0 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
18db0 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c  ;.    sPk.aiRowL
18dc0 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74  ogEst = aiRowEst
18dd0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72  Pk;.    sPk.onEr
18de0 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65  ror = OE_Replace
18df0 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65  ;.    sPk.pTable
18e00 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b   = pTab;.    sPk
18e10 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62  .szIdxRow = pTab
18e20 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
18e30 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
18e40 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
18e50 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
18e60 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  [1] = 0;.    pFi
18e70 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
18e80 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
18e90 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e  ( pSrc->fg.notIn
18ea0 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
18eb0 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
18ec0 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
18ed0 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
18ee0 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
18ef0 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
18f00 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
18f10 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
18f20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
18f30 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
18f40 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
18f50 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
18f60 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d  k;.  }.  rSize =
18f70 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
18f80 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20  t;.  rLogSize = 
18f90 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a  estLog(rSize);..
18fa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18fb0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
18fc0 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74  DEX.  /* Automat
18fd0 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  ic indexes */.  
18fe0 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70  if( !pBuilder->p
18ff0 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f  OrSet      /* No
19000 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20  t part of an OR 
19010 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a  optimization */.
19020 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
19030 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
19040 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
19050 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  =0.   && (pWInfo
19060 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ->pParse->db->fl
19070 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74  ags & SQLITE_Aut
19080 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26  oIndex)!=0.   &&
19090 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d   pSrc->pIBIndex=
190a0 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e  =0      /* Has n
190b0 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
190c0 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  use */.   && !pS
190d0 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
190e0 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f  d   /* Has no NO
190f0 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
19100 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77   */.   && HasRow
19110 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20 20  id(pTab)        
19120 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20   /* Not WITHOUT 
19130 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49  ROWID table. (FI
19140 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a  XME: Why not?) *
19150 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
19160 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f  g.isCorrelated /
19170 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
19180 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
19190 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69    && !pSrc->fg.i
191a0 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e  sRecursive  /* N
191b0 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 63  ot a recursive c
191c0 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
191d0 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a  ession. */.  ){.
191e0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
191f0 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65  auto-index Where
19200 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65  Loops */.    Whe
19210 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
19220 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57     WhereTerm *pW
19230 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
19240 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  pWC->nTerm;.    
19250 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
19260 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
19270 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  && pTerm<pWCEnd;
19280 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
19290 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
192a0 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
192b0 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
192c0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  nue;.      if( t
192d0 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
192e0 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29  (pTerm, pSrc, 0)
192f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
19300 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
19310 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
19320 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  >nSkip = 0;.    
19330 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
19340 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
19350 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
19360 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
19370 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
19380 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = pTerm;.       
19390 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d   /* TUNING: One-
193a0 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f  time cost for co
193b0 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f  mputing the auto
193c0 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20  matic index is. 
193d0 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61         ** estima
193e0 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f  ted to be X*N*lo
193f0 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73  g2(N) where N is
19400 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
19410 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ows in.        *
19420 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
19430 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68  g indexed and wh
19440 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45  ere X is 7 (LogE
19450 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61  st=28) for norma
19460 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  l.        ** tab
19470 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f  les or 1.375 (Lo
19480 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77  gEst=4) for view
19490 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
194a0 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20  .  The value.   
194b0 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20       ** of X is 
194c0 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77  smaller for view
194d0 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
194e0 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75 65   so that the que
194f0 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20  ry planner.     
19500 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f     ** will be mo
19510 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61 62  re aggressive ab
19520 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
19530 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73  utomatic indexes
19540 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
19550 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73  those objects, s
19560 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ince there is no
19570 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
19580 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20  add schema.     
19590 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e     ** indexes on
195a0 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20   subqueries and 
195b0 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  views. */.      
195c0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
195d0 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a   rLogSize + rSiz
195e0 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69  e + 4;.        i
195f0 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
19600 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61  ==0 && (pTab->ta
19610 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
19620 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  meral)==0 ){.   
19630 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
19640 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20  tup += 24;.     
19650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
19660 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
19670 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70  (pNew->rSetup, p
19680 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
19690 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
196a0 2d 3e 72 53 65 74 75 70 3c 30 20 29 20 70 4e 65  ->rSetup<0 ) pNe
196b0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
196c0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
196d0 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f  : Each index loo
196e0 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f  kup yields 20 ro
196f0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
19700 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a    This.        *
19710 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74  * is more than t
19720 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f  he usual guess o
19730 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65  f 10 rows, since
19740 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a   we have no way.
19750 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e          ** of kn
19760 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74  owing how select
19770 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ive the index wi
19780 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
19790 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20  .  It would.    
197a0 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e      ** not be un
197b0 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61  reasonable to ma
197c0 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75  ke this value mu
197d0 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20  ch larger. */.  
197e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
197f0 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20   = 43;  assert( 
19800 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  43==sqlite3LogEs
19810 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20  t(20) );.       
19820 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
19830 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
19840 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f  LogSize,pNew->nO
19850 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ut);.        pNe
19860 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
19870 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20  RE_AUTO_INDEX;. 
19880 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
19890 72 65 71 20 3d 20 6d 50 72 65 72 65 71 20 7c 20  req = mPrereq | 
198a0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
198b0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
198c0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
198d0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
198e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
198f0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
19900 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
19910 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20  TIC_INDEX */..  
19920 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
19930 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20   indices.  */.  
19940 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
19950 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70  _OK && pProbe; p
19960 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e  Probe=pProbe->pN
19970 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29  ext, iSortIdx++)
19980 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65  {.    if( pProbe
19990 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
199a0 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72  =0.     && !wher
199b0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
199c0 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f  dex(pSrc->iCurso
199d0 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e  r, pWC, pProbe->
199e0 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29  pPartIdxWhere) )
199f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
19a00 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53  ( pNew->iTab!=pS
19a10 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20  rc->iCursor );  
19a20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39  /* See ticket [9
19a30 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20  8d973b8f5] */.  
19a40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
19a50 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20  * Partial index 
19a60 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  inappropriate fo
19a70 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
19a80 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20      }.    rSize 
19a90 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
19aa0 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e  ogEst[0];.    pN
19ab0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
19ac0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  = 0;.    pNew->u
19ad0 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 30 3b  .btree.nBtm = 0;
19ae0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
19af0 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20 20 20  ee.nTop = 0;.   
19b00 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30   pNew->nSkip = 0
19b10 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ;.    pNew->nLTe
19b20 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rm = 0;.    pNew
19b30 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
19b40 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
19b50 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19b60 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71  prereq = mPrereq
19b70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
19b80 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e   = rSize;.    pN
19b90 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
19ba0 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  ex = pProbe;.   
19bb0 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48   b = indexMightH
19bc0 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 70  elpWithOrderBy(p
19bd0 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c  Builder, pProbe,
19be0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b   pSrc->iCursor);
19bf0 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50  .    /* The ONEP
19c00 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67  ASS_DESIRED flag
19c10 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74  s never occurs t
19c20 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52 44  ogether with ORD
19c30 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73  ER BY */.    ass
19c40 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63  ert( (pWInfo->wc
19c50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
19c60 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
19c70 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a  )==0 || b==0 );.
19c80 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
19c90 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  tnum<=0 ){.     
19ca0 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d   /* Integer prim
19cb0 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f  ary key index */
19cc0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
19cd0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b  lags = WHERE_IPK
19ce0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  ;..      /* Full
19cf0 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
19d00 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
19d10 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
19d20 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a  dx : 0;.      /*
19d30 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
19d40 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
19d50 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a   is (N*3.0). */.
19d60 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
19d70 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20   = rSize + 16;. 
19d80 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
19d90 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
19da0 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  Run, pTab->costM
19db0 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ult);.      wher
19dc0 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
19dd0 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  t(pWC, pNew, rSi
19de0 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ze);.      rc = 
19df0 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
19e00 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
19e10 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
19e20 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
19e30 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
19e40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19e50 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20    Bitmask m;.   
19e60 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69     if( pProbe->i
19e70 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20  sCovering ){.   
19e80 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
19e90 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs = WHERE_IDX_O
19ea0 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45  NLY | WHERE_INDE
19eb0 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  XED;.        m =
19ec0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
19ed0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72  .        m = pSr
19ee0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f  c->colUsed & ~co
19ef0 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72  lumnsInIndex(pPr
19f00 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  obe);.        pN
19f10 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
19f20 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
19f30 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
19f40 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
19f50 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a  DEXED;.      }..
19f60 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63        /* Full sc
19f70 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a  an via index */.
19f80 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20 20        if( b.    
19f90 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
19fa0 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20  pTab).       || 
19fb0 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
19fc0 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 20 20  Where!=0.       
19fd0 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20  || ( m==0.      
19fe0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55     && pProbe->bU
19ff0 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
1a000 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d       && (pProbe-
1a010 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
1a020 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20  szTabRow).      
1a030 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1a040 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1a050 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
1a060 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  D)==0.         &
1a070 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
1a080 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20  onfig.bUseCis.  
1a090 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
1a0a0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57  zationEnabled(pW
1a0b0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1a0c0 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64  , SQLITE_CoverId
1a0d0 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20  xScan).         
1a0e0 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20   ).      ){.    
1a0f0 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
1a100 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64  dx = b ? iSortId
1a110 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  x : 0;..        
1a120 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76  /* The cost of v
1a130 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  isiting the inde
1a140 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77  x rows is N*K, w
1a150 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20  here K is.      
1a160 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31    ** between 1.1
1a170 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64   and 3.0, depend
1a180 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  ing on the relat
1a190 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65  ive sizes of the
1a1a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
1a1b0 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73  x and table rows
1a1c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
1a1d0 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
1a1e0 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
1a1f0 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62  ->szIdxRow)/pTab
1a200 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20  ->szTabRow;.    
1a210 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
1a220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1a230 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
1a240 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
1a250 6e 2c 20 61 64 64 20 69 6e 20 74 68 65 20 63 6f  n, add in the co
1a260 73 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  st of.          
1a270 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c  ** doing table l
1a280 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20 63 6f 73  ookups.  The cos
1a290 74 20 77 69 6c 6c 20 62 65 20 33 78 20 74 68 65  t will be 3x the
1a2a0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
1a2b0 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e       ** lookups.
1a2c0 20 20 54 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f    Take into acco
1a2d0 75 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  unt WHERE clause
1a2e0 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1a2f0 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  be.          ** 
1a300 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
1a310 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2c 20  just the index, 
1a320 61 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  and that do not 
1a330 72 65 71 75 69 72 65 20 61 0a 20 20 20 20 20 20  require a.      
1a340 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f      ** table loo
1a350 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  kup. */.        
1a360 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75 70    LogEst nLookup
1a370 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 20 20   = rSize + 16;  
1a380 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a 20 20 4e  /* Base cost:  N
1a390 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  *3 */.          
1a3a0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
1a3b0 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
1a3c0 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  c->iCursor;.    
1a3d0 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
1a3e0 65 20 2a 70 57 43 32 20 3d 20 26 70 57 49 6e 66  e *pWC2 = &pWInf
1a3f0 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20 20 20  o->sWC;.        
1a400 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1a410 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  WC2->nTerm; ii++
1a420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 57  ){.            W
1a430 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
1a440 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a  = &pWC2->a[ii];.
1a450 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a460 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65  !sqlite3ExprCove
1a470 72 65 64 42 79 49 6e 64 65 78 28 70 54 65 72 6d  redByIndex(pTerm
1a480 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c 20 70  ->pExpr, iCur, p
1a490 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
1a4a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a4b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 72           /* pTer
1a4d0 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74  m can be evaluat
1a4e0 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68  ed using just th
1a4f0 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72 65 64  e index.  So red
1a500 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  uce.            
1a510 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65 64 20  ** the expected 
1a520 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 20  number of table 
1a530 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64 69 6e  lookups accordin
1a540 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  gly */.         
1a550 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
1a560 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
1a570 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f              nLoo
1a580 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  kup += pTerm->tr
1a590 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20  uthProb;.       
1a5a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a5b0 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75            nLooku
1a5c0 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  p--;.           
1a5d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1a5e0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
1a5f0 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b 75  |WO_IS) ) nLooku
1a600 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20 20  p -= 19;.       
1a610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a620 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20   }.          .  
1a630 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
1a640 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
1a650 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
1a660 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20 20  , nLookup);.    
1a670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
1a680 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
1a690 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54  r(pNew->rRun, pT
1a6a0 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20  ab->costMult);. 
1a6b0 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
1a6c0 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57 43  OutputAdjust(pWC
1a6d0 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a  , pNew, rSize);.
1a6e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1a6f0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1a700 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1a710 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
1a720 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20   = rSize;.      
1a730 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
1a740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a750 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62  .    pBuilder->b
1a760 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ldFlags = 0;.   
1a770 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1a780 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
1a790 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
1a7a0 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  obe, 0);.    if(
1a7b0 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
1a7c0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44 46  ags==SQLITE_BLDF
1a7d0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
1a7e0 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75 6e    /* If a non-un
1a7f0 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75 73  ique index is us
1a800 65 64 2c 20 6f 72 20 69 66 20 61 20 70 72 65 66  ed, or if a pref
1a810 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20 66 6f  ix of the key fo
1a820 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75  r.      ** uniqu
1a830 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20  e index is used 
1a840 28 6d 61 6b 69 6e 67 20 74 68 65 20 69 6e 64 65  (making the inde
1a850 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e  x functionally n
1a860 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20 20 20 20  on-unique).     
1a870 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 71 6c   ** then the sql
1a880 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 20 62  ite_stat1 data b
1a890 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e 74  ecomes important
1a8a0 20 66 6f 72 20 73 63 6f 72 69 6e 67 20 74 68 65   for scoring the
1a8b0 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20 2a  .      ** plan *
1a8c0 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  /.      pTab->ta
1a8d0 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74 61  bFlags |= TF_Sta
1a8e0 74 73 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23 69  tsUsed;.    }.#i
1a8f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a900 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
1a910 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  4.    sqlite3Sta
1a920 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75 69  t4ProbeFree(pBui
1a930 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20  lder->pRec);.   
1a940 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
1a950 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42  alid = 0;.    pB
1a960 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30  uilder->pRec = 0
1a970 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
1a980 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
1a990 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1a9a0 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
1a9b0 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
1a9c0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
1a9d0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
1a9e0 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20 62  rc->pIBIndex ) b
1a9f0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1aa00 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1aa10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1aa20 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a  RTUALTABLE../*.*
1aa30 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 49  * Argument pIdxI
1aa40 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20 70  nfo is already p
1aa50 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c  opulated with al
1aa60 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  l constraints th
1aa70 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65  at may.** be use
1aa80 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61 6c  d by the virtual
1aa90 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
1aaa0 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70  d by pBuilder->p
1aab0 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73 0a  New->iTab. This.
1aac0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b  ** function mark
1aad0 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68  s a subset of th
1aae0 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ose constraints 
1aaf0 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73 20  usable, invokes 
1ab00 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  the.** xBestInde
1ab10 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64 64  x method and add
1ab20 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70  s the returned p
1ab30 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72 2e  lan to pBuilder.
1ab40 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72 61  .**.** A constra
1ab50 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75 73  int is marked us
1ab60 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  able if:.**.**  
1ab70 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73 61   * Argument mUsa
1ab80 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ble indicates th
1ab90 61 74 20 69 74 73 20 70 72 65 72 65 71 75 69 73  at its prerequis
1aba0 69 74 65 73 20 61 72 65 20 61 76 61 69 6c 61 62  ites are availab
1abb0 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  le, and.**.**   
1abc0 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65 20  * It is not one 
1abd0 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  of the operators
1abe0 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
1abf0 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b 20  e mExclude mask 
1ac00 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61 73  passed.**     as
1ac10 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
1ac20 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20 70  ment (which in p
1ac30 72 61 63 74 69 63 65 20 69 73 20 65 69 74 68 65  ractice is eithe
1ac40 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a  r WO_IN or 0)..*
1ac50 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d 50  *.** Argument mP
1ac60 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20  rereq is a mask 
1ac70 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
1ac80 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1ac90 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69 72  efore the.** vir
1aca0 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71 75  tual table in qu
1acb0 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61 72  estion. These ar
1acc0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
1acd0 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73 69 74  lans prerequisit
1ace0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20  es.** before it 
1acf0 69 73 20 61 64 64 65 64 20 74 6f 20 70 42 75 69  is added to pBui
1ad00 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70  lder..**.** Outp
1ad10 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62  ut parameter *pb
1ad20 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  In is set to tru
1ad30 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61 64  e if the plan ad
1ad40 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 0a  ded to pBuilder.
1ad50 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ** uses one or m
1ad60 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73 2c  ore WO_IN terms,
1ad70 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
1ad80 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1ad90 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
1ada0 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68 65  irtualOne(.  Whe
1adb0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
1adc0 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d 61  Builder,.  Bitma
1add0 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20  sk mPrereq,     
1ade0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1adf0 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
1ae00 74 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e 20  t must be used. 
1ae10 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 73  */.  Bitmask mUs
1ae20 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1ae30 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1ae40 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a 2f  usable tables */
1ae50 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65 2c  .  u16 mExclude,
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74 65     /* Exclude te
1ae80 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65 20  rms using these 
1ae90 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 73  operators */.  s
1aea0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1aeb0 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20 2f  o *pIdxInfo,   /
1aec0 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a 65  * Populated obje
1aed0 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65  ct for xBestInde
1aee0 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d  x */.  u16 mNoOm
1aef0 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
1af00 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1af10 20 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e 73   omit these cons
1af20 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  traints */.  int
1af30 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20 20   *pbIn          
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af50 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c 61  OUT: True if pla
1af60 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e  n uses an IN(...
1af70 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  ) op */.){.  Whe
1af80 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20  reClause *pWC = 
1af90 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
1afa0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
1afb0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1afc0 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
1afd0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1afe0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
1aff0 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70 49  age *pUsage = pI
1b000 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1b010 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74 20  intUsage;.  int 
1b020 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b  i;.  int mxTerm;
1b030 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1b040 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f  TE_OK;.  WhereLo
1b050 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69 6c  op *pNew = pBuil
1b060 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61 72  der->pNew;.  Par
1b070 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42 75  se *pParse = pBu
1b080 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
1b090 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74 20  Parse;.  struct 
1b0a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1b0b0 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e  rc = &pBuilder->
1b0c0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1b0d0 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1b0e0 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69  .  int nConstrai
1b0f0 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt = pIdxInfo->n
1b100 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 61  Constraint;..  a
1b110 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65 20  ssert( (mUsable 
1b120 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72 65  & mPrereq)==mPre
1b130 72 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d  req );.  *pbIn =
1b140 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72   0;.  pNew->prer
1b150 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a 20  eq = mPrereq;.. 
1b160 20 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61 62   /* Set the usab
1b170 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73  le flag on the s
1b180 75 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61  ubset of constra
1b190 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64 20  ints identified 
1b1a0 62 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e  by .  ** argumen
1b1b0 74 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d  ts mUsable and m
1b1c0 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49  Exclude. */.  pI
1b1d0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
1b1e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1b1f0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
1b200 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1b210 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
1b220 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1b230 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
1b240 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1b250 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
1b260 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
1b270 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78  ffset];.    pIdx
1b280 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30  Cons->usable = 0
1b290 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1b2a0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
1b2b0 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d  mUsable)==pTerm-
1b2c0 3e 70 72 65 72 65 71 52 69 67 68 74 20 0a 20 20  >prereqRight .  
1b2d0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f     && (pTerm->eO
1b2e0 70 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75  perator & mExclu
1b2f0 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  de)==0.    ){.  
1b300 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
1b310 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
1b320 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
1b330 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
1b340 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71  fields of the sq
1b350 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1b360 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1b370 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
1b380 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
1b390 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29  0])*nConstraint)
1b3a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
1b3b0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1b3c0 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 70  IdxStr==0 );.  p
1b3d0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
1b3e0 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
1b3f0 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70  >idxNum = 0;.  p
1b400 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
1b410 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
1b420 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1b430 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
1b440 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
1b450 6c 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f  le)2;.  pIdxInfo
1b460 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
1b470 3d 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66 6f  = 25;.  pIdxInfo
1b480 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b 0a  ->idxFlags = 0;.
1b490 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55    pIdxInfo->colU
1b4a0 73 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  sed = (sqlite3_i
1b4b0 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73  nt64)pSrc->colUs
1b4c0 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  ed;..  /* Invoke
1b4d0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1b4e0 6c 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  le xBestIndex() 
1b4f0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20 3d  method */.  rc =
1b500 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
1b510 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54 61  Parse, pSrc->pTa
1b520 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
1b530 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1b540 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20  rc;..  mxTerm = 
1b550 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  -1;.  assert( pN
1b560 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e  ew->nLSlot>=nCon
1b570 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72  straint );.  for
1b580 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
1b590 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
1b5a0 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
1b5b0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1b5c0 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49  itMask = 0;.  pI
1b5d0 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
1b5e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1b5f0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
1b600 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
1b610 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
1b620 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1b630 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
1b640 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a  .    int iTerm;.
1b650 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d      if( (iTerm =
1b660 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
1b670 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a  ndex - 1)>=0 ){.
1b680 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1b690 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  *pTerm;.      in
1b6a0 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e  t j = pIdxCons->
1b6b0 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
1b6c0 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43     if( iTerm>=nC
1b6d0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
1b6e0 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c   || j<0.       |
1b6f0 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a  | j>=pWC->nTerm.
1b700 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e         || pNew->
1b710 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30  aLTerm[iTerm]!=0
1b720 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 43  .       || pIdxC
1b730 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20  ons->usable==0. 
1b740 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b750 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1b760 52 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  R;.        sqlit
1b770 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b780 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78  e,"%s.xBestIndex
1b790 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53   malfunction",pS
1b7a0 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
1b7b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1b7c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b7d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
1b7e0 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
1b7f0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
1b800 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20  ase( j==0 );.   
1b810 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1b820 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a  pWC->nTerm-1 );.
1b830 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
1b840 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
1b850 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20  pNew->prereq |= 
1b860 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
1b870 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
1b880 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c  ( iTerm<pNew->nL
1b890 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Slot );.      pN
1b8a0 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
1b8b0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
1b8c0 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72   if( iTerm>mxTer
1b8d0 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65  m ) mxTerm = iTe
1b8e0 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  rm;.      testca
1b8f0 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
1b900 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b910 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20   iTerm==16 );.  
1b920 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36      if( iTerm<16
1b930 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d   && pUsage[i].om
1b940 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61  it ) pNew->u.vta
1b950 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c  b.omitMask |= 1<
1b960 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66  <iTerm;.      if
1b970 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1b980 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
1b990 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
1b9a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
1b9b0 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
1b9c0 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73  d by an IN claus
1b9d0 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20  e may not.      
1b9e0 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65    ** consume the
1b9f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ba00 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68 65   because (1) the
1ba10 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72   order of IN ter
1ba20 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ms.        ** is
1ba30 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1ba40 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
1ba50 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
1ba60 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
1ba70 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c    ** (2) Multipl
1ba80 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61  e outputs from a
1ba90 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65   single IN value
1baa0 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a   will not merge.
1bab0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74          ** toget
1bac0 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  her.  */.       
1bad0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
1bae0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
1baf0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
1bb00 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53  ->idxFlags &= ~S
1bb10 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
1bb20 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20  _UNIQUE;.       
1bb30 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73 65   *pbIn = 1; asse
1bb40 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26 20  rt( (mExclude & 
1bb50 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20  WO_IN)==0 );.   
1bb60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1bb70 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
1bb80 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d  itMask &= ~mNoOm
1bb90 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  it;..  pNew->nLT
1bba0 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
1bbb0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1bbc0 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c  nLTerm<=pNew->nL
1bbd0 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  Slot );.  pNew->
1bbe0 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20  u.vtab.idxNum = 
1bbf0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
1bc00 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1bc10 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78  .needFree = pIdx
1bc20 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1bc30 49 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e  IdxStr;.  pIdxIn
1bc40 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1bc50 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  xStr = 0;.  pNew
1bc60 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20  ->u.vtab.idxStr 
1bc70 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  = pIdxInfo->idxS
1bc80 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74  tr;.  pNew->u.vt
1bc90 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  ab.isOrdered = (
1bca0 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  i8)(pIdxInfo->or
1bcb0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a  derByConsumed ?.
1bcc0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
1bcd0 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20  nOrderBy : 0);. 
1bce0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1bcf0 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  0;.  pNew->rRun 
1bd00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46  = sqlite3LogEstF
1bd10 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e  romDouble(pIdxIn
1bd20 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
1bd30 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  t);.  pNew->nOut
1bd40 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1bd50 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
1bd60 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a  atedRows);..  /*
1bd70 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f   Set the WHERE_O
1bd80 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68  NEROW flag if th
1bd90 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  e xBestIndex() m
1bda0 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a  ethod indicated.
1bdb0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63    ** that the sc
1bdc0 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74  an will visit at
1bdd0 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43   most one row. C
1bde0 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69 73  lear it otherwis
1bdf0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78  e. */.  if( pIdx
1be00 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26  Info->idxFlags &
1be10 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43   SQLITE_INDEX_SC
1be20 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20  AN_UNIQUE ){.   
1be30 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
1be40 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  = WHERE_ONEROW;.
1be50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
1be60 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57  w->wsFlags &= ~W
1be70 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d  HERE_ONEROW;.  }
1be80 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  .  rc = whereLoo
1be90 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
1bea0 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70  , pNew);.  if( p
1beb0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1bec0 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
1bed0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75  te3_free(pNew->u
1bee0 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1bef0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
1bf00 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
1bf10 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  }.  WHERETRACE(0
1bf20 78 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25  xffff, ("  bIn=%
1bf30 64 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c  d prereqIn=%04ll
1bf40 78 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c  x prereqOut=%04l
1bf50 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lx\n",.         
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 62               *pb
1bf70 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  In, (sqlite3_uin
1bf80 74 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20  t64)mPrereq,.   
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74     (sqlite3_uint
1bfb0 36 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71  64)(pNew->prereq
1bfc0 20 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a   & ~mPrereq)));.
1bfd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bfe0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1bff0 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1c000 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66  s for a table of
1c010 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69   the join identi
1c020 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c  fied by.** pBuil
1c030 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e  der->pNew->iTab.
1c040 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20    That table is 
1c050 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1c060 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1c070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
1c080 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20   are no LEFT or 
1c090 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73  CROSS JOIN joins
1c0a0 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20 62   in the query, b
1c0b0 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64 0a  oth mPrereq and.
1c0c0 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72 65  ** mUnusable are
1c0d0 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72   set to 0. Other
1c0e0 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69 73  wise, mPrereq is
1c0f0 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46   a mask of all F
1c100 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e  ROM clause.** en
1c110 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
1c120 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72 74   before the virt
1c130 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ual table in the
1c140 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64   FROM clause and
1c150 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65   are.** separate
1c160 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
1c170 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
1c180 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69  r CROSS JOIN. Si
1c190 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20  milarly, the.** 
1c1a0 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63  mUnusable mask c
1c1b0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d  ontains all FROM
1c1c0 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20   clause entries 
1c1d0 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72  that occur after
1c1e0 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
1c1f0 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65  table and are se
1c200 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20  parated from it 
1c210 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  by at least one 
1c220 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53  LEFT or .** CROS
1c230 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46  S JOIN. .**.** F
1c240 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1c250 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a  he query were:.*
1c260 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
1c270 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e  t1, t2 LEFT JOIN
1c280 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53   t3, t4, vt CROS
1c290 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a  S JOIN t5, t6;.*
1c2a0 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72 65  *.** then mPrere
1c2b0 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  q corresponds to
1c2c0 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55   (t1, t2) and mU
1c2d0 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20  nusable to (t5, 
1c2e0 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  t6)..**.** All t
1c2f0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50 72  he tables in mPr
1c300 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63 61  ereq must be sca
1c310 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  nned before the 
1c320 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20  current virtual 
1c330 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e  .** table. So an
1c340 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63  y terms for whic
1c350 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69  h all prerequisi
1c360 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65  tes are satisfie
1c370 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71  d by .** mPrereq
1c380 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65   may be specifie
1c390 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e  d as "usable" in
1c3a0 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42   all calls to xB
1c3b0 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f  estIndex. .** Co
1c3c0 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61  nversely, all ta
1c3d0 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c  bles in mUnusabl
1c3e0 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  e must be scanne
1c3f0 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  d after the curr
1c400 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  ent.** virtual t
1c410 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72  able, so any ter
1c420 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ms for which the
1c430 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   prerequisites o
1c440 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d  verlap with.** m
1c450 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20  Unusable should 
1c460 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67  always be config
1c470 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61  ured as "not-usa
1c480 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e  ble" for xBestIn
1c490 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
1c4a0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  nt whereLoopAddV
1c4b0 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c  irtual(.  WhereL
1c4c0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
1c4d0 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20  lder,  /* WHERE 
1c4e0 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
1c4f0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
1c500 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20  mPrereq,        
1c510 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
1c520 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
1c530 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ned before this 
1c540 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  one */.  Bitmask
1c550 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20   mUnusable      
1c560 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1c570 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1c580 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20  nned after this 
1c590 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  one */.){.  int 
1c5a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1c5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c5c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65  rn code */.  Whe
1c5d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
1c5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
1c5f0 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74  RE analysis cont
1c600 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ext */.  Parse *
1c610 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1c620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1c630 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1c640 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1c650 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  WC;            /
1c660 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1c670 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1c680 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
1c690 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1c6a0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
1c6b0 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69  search */.  sqli
1c6c0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
1c6d0 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65  p;       /* Obje
1c6e0 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  ct to pass to xB
1c6f0 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20  estIndex() */.  
1c700 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c720 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  Number of constr
1c730 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20  aints in p */.  
1c740 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20 20  int bIn;        
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c760 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65  True if plan use
1c770 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  s IN(...) operat
1c780 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  or */.  WhereLoo
1c790 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61  p *pNew;.  Bitma
1c7a0 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20 20  sk mBest;       
1c7b0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1c7c0 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20 70  s used by best p
1c7d0 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a  ossible plan */.
1c7e0 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 0a    u16 mNoOmit;..
1c7f0 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65 72    assert( (mPrer
1c800 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d  eq & mUnusable)=
1c810 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  =0 );.  pWInfo =
1c820 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1c830 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
1c840 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1c850 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1c860 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
1c870 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1c880 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
1c890 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
1c8a0 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65 72  ->iTab];.  asser
1c8b0 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72  t( IsVirtual(pSr
1c8c0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70 20  c->pTab) );.  p 
1c8d0 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
1c8e0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
1c8f0 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63   mUnusable, pSrc
1c900 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
1c910 65 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d 4e  erBy, .      &mN
1c920 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70 3d  oOmit);.  if( p=
1c930 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1c940 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1c950 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
1c960 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
1c970 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
1c980 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
1c990 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
1c9a0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
1c9b0 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e  Free = 0;.  nCon
1c9c0 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f  straint = p->nCo
1c9d0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20  nstraint;.  if( 
1c9e0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
1c9f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1ca00 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29  , nConstraint) )
1ca10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1ca20 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1ca30 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
1ca40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1ca50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
1ca60 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64 65  t call xBestInde
1ca70 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  x() with all con
1ca80 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2e  straints usable.
1ca90 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
1caa0 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1cab0 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c  alOne: all usabl
1cac0 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20 77  e\n"));.  rc = w
1cad0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1cae0 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20  alOne(pBuilder, 
1caf0 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53  mPrereq, ALLBITS
1cb00 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c  , 0, p, mNoOmit,
1cb10 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66   &bIn);..  /* If
1cb20 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42 65   the call to xBe
1cb30 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61  stIndex() with a
1cb40 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65 64  ll terms enabled
1cb50 20 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61 6e   produced a plan
1cb60 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  .  ** that does 
1cb70 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
1cb80 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28 49  source tables (I
1cb90 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68 20  OW: a plan with 
1cba0 6d 42 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20  mBest==0),.  ** 
1cbb0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
1cbc0 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67   point in making
1cbd0 20 61 6e 79 20 66 75 72 74 68 65 72 20 63 61 6c   any further cal
1cbe0 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ls to xBestIndex
1cbf0 28 29 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  () .  ** since t
1cc00 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74  hey will all ret
1cc10 75 72 6e 20 74 68 65 20 73 61 6d 65 20 72 65 73  urn the same res
1cc20 75 6c 74 20 28 69 66 20 74 68 65 20 78 42 65 73  ult (if the xBes
1cc30 74 49 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d  tIndex().  ** im
1cc40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
1cc50 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20  sane). */.  if( 
1cc60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1cc70 20 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77 2d   (mBest = (pNew-
1cc80 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72  >prereq & ~mPrer
1cc90 65 71 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  eq))!=0 ){.    i
1cca0 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b  nt seenZero = 0;
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ccc0 54 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20 77  True if a plan w
1ccd0 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 73  ith no prereqs s
1cce0 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  een */.    int s
1ccf0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b  eenZeroNoIN = 0;
1cd00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e           /* Plan
1cd10 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73   with no prereqs
1cd20 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20   and no IN(...) 
1cd30 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d  seen */.    Bitm
1cd40 61 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20  ask mPrev = 0;. 
1cd50 20 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74     Bitmask mBest
1cd60 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  NoIn = 0;..    /
1cd70 2a 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70 72  * If the plan pr
1cd80 6f 64 75 63 65 64 20 62 79 20 74 68 65 20 65 61  oduced by the ea
1cd90 72 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73 20  rlier call uses 
1cda0 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c  an IN(...) term,
1cdb0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65   call.    ** xBe
1cdc0 73 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20 74  stIndex again, t
1cdd0 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 49 4e  his time with IN
1cde0 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73 61  (...) terms disa
1cdf0 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  bled. */.    if(
1ce00 20 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57 48   bIn ){.      WH
1ce10 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1ce20 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61  "  VirtualOne: a
1ce30 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e  ll usable w/o IN
1ce40 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20  \n"));.      rc 
1ce50 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1ce60 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20  rtualOne(.      
1ce70 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50      pBuilder, mP
1ce80 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20  rereq, ALLBITS, 
1ce90 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69  WO_IN, p, mNoOmi
1cea0 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20  t, &bIn);.      
1ceb0 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20 29  assert( bIn==0 )
1cec0 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f 49  ;.      mBestNoI
1ced0 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  n = pNew->prereq
1cee0 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20 20   & ~mPrereq;.   
1cef0 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49 6e     if( mBestNoIn
1cf00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1cf10 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20  eenZero = 1;.   
1cf20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f 49       seenZeroNoI
1cf30 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  N = 1;.      }. 
1cf40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c     }..    /* Cal
1cf50 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e 63  l xBestIndex onc
1cf60 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74 69  e for each disti
1cf70 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70 72  nct value of (pr
1cf80 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50 72  ereqRight & ~mPr
1cf90 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69 6e  ereq) .    ** in
1cfa0 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72 6d   the set of term
1cfb0 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f 20  s that apply to 
1cfc0 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72 74  the current virt
1cfd0 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ual table.  */. 
1cfe0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1cff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d000 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42 69   int i;.      Bi
1d010 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41 4c  tmask mNext = AL
1d020 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73 73  LBITS;.      ass
1d030 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b 0a  ert( mNext>0 );.
1d040 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1d050 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  <nConstraint; i+
1d060 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  +){.        Bitm
1d070 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20 20  ask mThis = (.  
1d080 20 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61            pWC->a
1d090 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  [p->aConstraint[
1d0a0 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e  i].iTermOffset].
1d0b0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d  prereqRight & ~m
1d0c0 50 72 65 72 65 71 0a 20 20 20 20 20 20 20 20 29  Prereq.        )
1d0d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54  ;.        if( mT
1d0e0 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54 68  his>mPrev && mTh
1d0f0 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78 74  is<mNext ) mNext
1d100 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20 20   = mThis;.      
1d110 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d 20  }.      mPrev = 
1d120 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66 28  mNext;.      if(
1d130 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53 20   mNext==ALLBITS 
1d140 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
1d150 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 20  f( mNext==mBest 
1d160 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74 4e  || mNext==mBestN
1d170 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oIn ) continue;.
1d180 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
1d190 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75  (0x40, ("  Virtu
1d1a0 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30 34  alOne: mPrev=%04
1d1b0 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c 78  llx mNext=%04llx
1d1c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d1d0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1d1e0 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65  ite3_uint64)mPre
1d1f0 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  v, (sqlite3_uint
1d200 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20 20  64)mNext));.    
1d210 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1d220 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20  AddVirtualOne(. 
1d230 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64 65           pBuilde
1d240 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78  r, mPrereq, mNex
1d250 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c  t|mPrereq, 0, p,
1d260 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1d270 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
1d280 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65 71  >prereq==mPrereq
1d290 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e   ){.        seen
1d2a0 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  Zero = 1;.      
1d2b0 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73    if( bIn==0 ) s
1d2c0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1d2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d2e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61      /* If the ca
1d2f0 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1d300 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76 65  x() in the above
1d310 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66 69   loop did not fi
1d320 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1d330 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1d340 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1d350 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65  at all (i.e. one
1d360 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1d370 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 29  e.    ** usable)
1d380 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68 65  , make a call he
1d390 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75 72  re with all sour
1d3a0 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62 6c  ce tables disabl
1d3b0 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ed */.    if( rc
1d3c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1d3d0 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20  eenZero==0 ){.  
1d3e0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1d3f0 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1d400 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65  One: all disable
1d410 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  d\n"));.      rc
1d420 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1d430 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1d440 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1d450 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c  Prereq, mPrereq,
1d460 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20   0, p, mNoOmit, 
1d470 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &bIn);.      if(
1d480 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65   bIn==0 ) seenZe
1d490 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  roNoIN = 1;.    
1d4a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1d4b0 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49   calls to xBestI
1d4c0 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20 66  ndex() have so f
1d4d0 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e  ar failed to fin
1d4e0 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20  d a plan.    ** 
1d4f0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f  that requires no
1d500 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61   source tables a
1d510 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20 6e  t all and does n
1d520 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e 2e  ot use an IN(...
1d530 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ).    ** operato
1d540 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c 20  r, make a final 
1d550 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20 6f  call to obtain o
1d560 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20  ne here.  */.   
1d570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d580 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e 6f  OK && seenZeroNo
1d590 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  IN==0 ){.      W
1d5a0 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1d5b0 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1d5c0 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e 64  all disabled and
1d5d0 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20   w/o IN\n"));.  
1d5e0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1d5f0 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1d600 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c  .          pBuil
1d610 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50  der, mPrereq, mP
1d620 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c  rereq, WO_IN, p,
1d630 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1d640 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1d650 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  ( p->needToFreeI
1d660 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f  dxStr ) sqlite3_
1d670 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b  free(p->idxStr);
1d680 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1d690 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  NN(pParse->db, p
1d6a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d6b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1d6c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1d6d0 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ABLE */../*.** A
1d6e0 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  dd WhereLoop ent
1d6f0 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f  ries to handle O
1d700 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77  R terms.  This w
1d710 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a  orks for either.
1d720 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72  ** btrees or vir
1d730 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  tual tables..*/.
1d740 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
1d750 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68 65  LoopAddOr(.  Whe
1d760 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
1d770 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74 6d  Builder, .  Bitm
1d780 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20 20  ask mPrereq, .  
1d790 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c  Bitmask mUnusabl
1d7a0 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  e.){.  WhereInfo
1d7b0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
1d7c0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57  der->pWInfo;.  W
1d7d0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1d7e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
1d7f0 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ew;.  WhereTerm 
1d800 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b  *pTerm, *pWCEnd;
1d810 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d820 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75  TE_OK;.  int iCu
1d830 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  r;.  WhereClause
1d840 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65   tempWC;.  Where
1d850 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62  LoopBuilder sSub
1d860 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72  Build;.  WhereOr
1d870 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a  Set sSum, sCur;.
1d880 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d890 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1d8a0 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
1d8b0 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64  r->pWC;.  pWCEnd
1d8c0 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
1d8d0 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d  >nTerm;.  pNew =
1d8e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
1d8f0 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c  .  memset(&sSum,
1d900 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29   0, sizeof(sSum)
1d910 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49  );.  pItem = pWI
1d920 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1d930 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
1d940 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69   iCur = pItem->i
1d950 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70  Cursor;..  for(p
1d960 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
1d970 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d  rm<pWCEnd && rc=
1d980 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72  =SQLITE_OK; pTer
1d990 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
1d9a0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1d9b0 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20  & WO_OR)!=0.    
1d9c0 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f   && (pTerm->u.pO
1d9d0 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
1d9e0 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
1d9f0 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  f)!=0 .    ){.  
1da00 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1da10 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
1da20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
1da30 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
1da40 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
1da50 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
1da60 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
1da70 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
1da80 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
1da90 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
1daa0 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
1dab0 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75 62  .    .      sSub
1dac0 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65  Build = *pBuilde
1dad0 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  r;.      sSubBui
1dae0 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  ld.pOrderBy = 0;
1daf0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1db00 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b  .pOrSet = &sCur;
1db10 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ..      WHERETRA
1db20 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67 69  CE(0x200, ("Begi
1db30 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d  n processing OR-
1db40 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54  clause %p\n", pT
1db50 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  erm));.      for
1db60 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
1db70 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
1db80 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
1db90 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
1dba0 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
1dbb0 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b   & WO_AND)!=0 ){
1dbc0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
1dbd0 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54  uild.pWC = &pOrT
1dbe0 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
1dbf0 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  >wc;.        }el
1dc00 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
1dc10 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
1dc20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
1dc30 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57  mpWC.pWInfo = pW
1dc40 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20  C->pWInfo;.     
1dc50 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
1dc60 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
1dc70 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
1dc80 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
1dc90 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d    tempWC.nTerm =
1dca0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   1;.          te
1dcb0 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d  mpWC.a = pOrTerm
1dcc0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  ;.          sSub
1dcd0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d  Build.pWC = &tem
1dce0 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pWC;.        }el
1dcf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
1dd00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1dd10 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e  }.        sCur.n
1dd20 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45   = 0;.#ifdef WHE
1dd30 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
1dd40 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
1dd50 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74  CE(0x200, ("OR-t
1dd60 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73  erm %d of %p has
1dd70 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22   %d subterms:\n"
1dd80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1dd90 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54        (int)(pOrT
1dda0 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70  erm-pOrWC->a), p
1ddb0 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e  Term, sSubBuild.
1ddc0 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20  pWC->nTerm));.  
1ddd0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1dde0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
1ddf0 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  400 ){.         
1de00 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
1de10 75 73 65 50 72 69 6e 74 28 73 53 75 62 42 75 69  usePrint(sSubBui
1de20 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20 20 20 20  ld.pWC);.       
1de30 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
1de40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1de50 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1de60 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
1de70 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
1de80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1de90 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1dea0 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20  ual(&sSubBuild, 
1deb0 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62  mPrereq, mUnusab
1dec0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
1ded0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1dee0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63    {.          rc
1def0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
1df00 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c  tree(&sSubBuild,
1df10 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20 20   mPrereq);.     
1df20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1df30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1df40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1df50 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28   whereLoopAddOr(
1df60 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1df70 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
1df80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1df90 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1dfa0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72  QLITE_OK || sCur
1dfb0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  .n==0 );.       
1dfc0 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29   if( sCur.n==0 )
1dfd0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  {.          sSum
1dfe0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
1dff0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1e000 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20   }else if( once 
1e010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  ){.          whe
1e020 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20  reOrMove(&sSum, 
1e030 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  &sCur);.        
1e040 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
1e050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e060 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74 20       WhereOrSet 
1e070 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  sPrev;.         
1e080 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 50   whereOrMove(&sP
1e090 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20 20  rev, &sSum);.   
1e0a0 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1e0b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
1e0c0 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e 3b  (i=0; i<sPrev.n;
1e0d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1e0e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43     for(j=0; j<sC
1e0f0 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ur.n; j++){.    
1e100 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
1e110 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20 73  rInsert(&sSum, s
1e120 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65 71  Prev.a[i].prereq
1e130 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72 65   | sCur.a[j].pre
1e140 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20  req,.           
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1e170 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75  d(sPrev.a[i].rRu
1e180 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75  n, sCur.a[j].rRu
1e190 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1e1c0 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74  (sPrev.a[i].nOut
1e1d0 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74  , sCur.a[j].nOut
1e1e0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1e1f0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e210 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65        pNew->nLTe
1e220 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4e  rm = 1;.      pN
1e230 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
1e240 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e 65  pTerm;.      pNe
1e250 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1e260 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20  RE_MULTI_OR;.   
1e270 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
1e280 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
1e290 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
1e2a0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e 65       memset(&pNe
1e2b0 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28  w->u, 0, sizeof(
1e2c0 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20 20  pNew->u));.     
1e2d0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
1e2e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53 75  LITE_OK && i<sSu
1e2f0 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m.n; i++){.     
1e300 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 75     /* TUNING: Cu
1e310 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b 69  rrently sSum.a[i
1e320 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74 6f  ].rRun is set to
1e330 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
1e340 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  costs.        **
1e350 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61 6e   of all sub-scan
1e360 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
1e370 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65 76  e OR-scan. Howev
1e380 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e 64  er, due to round
1e390 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ing.        ** e
1e3a0 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62 65  rrors, it may be
1e3b0 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f   that the cost o
1e3c0 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69 73  f the OR-scan is
1e3d0 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20 20   equal to its.  
1e3e0 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65 78        ** most ex
1e3f0 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61 6e  pensive sub-scan
1e400 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c 65  . Add the smalle
1e410 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e 61  st possible pena
1e420 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  lty .        ** 
1e430 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6d  (equivalent to m
1e440 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20 63  ultiplying the c
1e450 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f 20  ost by 1.07) to 
1e460 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20 20  ensure that .   
1e470 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f 65       ** this doe
1e480 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f 74  s not happen. Ot
1e490 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48 45  herwise, for WHE
1e4a0 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68 20  RE clauses such 
1e4b0 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  as the.        *
1e4c0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 72  * following wher
1e4d0 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  e there is an in
1e4e0 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20 20  dex on "y":.    
1e4f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1e500 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b 65  *     WHERE like
1e510 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39 39  lihood(x=?, 0.99
1e520 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20 20  ) OR y=?.       
1e530 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
1e540 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20 65  he planner may e
1e550 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f 67  lect to "OR" tog
1e560 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62  ether a full-tab
1e570 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a 20  le scan and an. 
1e580 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
1e590 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68 65  lookup. And othe
1e5a0 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64 20  r similarly odd 
1e5b0 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20  results.  */.   
1e5c0 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
1e5d0 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  = sSum.a[i].rRun
1e5e0 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   + 1;.        pN
1e5f0 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e  ew->nOut = sSum.
1e600 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20  a[i].nOut;.     
1e610 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1e620 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72  = sSum.a[i].prer
1e630 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  eq;.        rc =
1e640 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
1e650 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1e660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e670 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30 30  WHERETRACE(0x200
1e680 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73 69  , ("End processi
1e690 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c  ng OR-clause %p\
1e6a0 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20  n", pTerm));.   
1e6b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e6c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
1e6d0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
1e6e0 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 74  bjects for all t
1e6f0 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69 63  ables .*/.static
1e700 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
1e710 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42 75  dAll(WhereLoopBu
1e720 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
1e730 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
1e740 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
1e750 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74 6d  ->pWInfo;.  Bitm
1e760 61 73 6b 20 6d 50 72 65 72 65 71 20 3d 20 30 3b  ask mPrereq = 0;
1e770 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69 6f  .  Bitmask mPrio
1e780 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  r = 0;.  int iTa
1e790 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
1e7a0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
1e7b0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  >pTabList;.  str
1e7c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e7d0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75 63   *pItem;.  struc
1e7e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e7f0 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73 74  pEnd = &pTabList
1e800 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ->a[pWInfo->nLev
1e810 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  el];.  sqlite3 *
1e820 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
1e830 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  rse->db;.  int r
1e840 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e850 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
1e860 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e  ;.  u8 priorJoin
1e870 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  type = 0;..  /* 
1e880 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
1e890 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
1e8a0 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1e8b0 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
1e8c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
1e8d0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
1e8e0 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
1e8f0 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
1e900 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70  List->a; pItem<p
1e910 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74  End; iTab++, pIt
1e920 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61  em++){.    Bitma
1e930 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20 30  sk mUnusable = 0
1e940 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62  ;.    pNew->iTab
1e950 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65   = iTab;.    pNe
1e960 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73 71  w->maskSelf = sq
1e970 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
1e980 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1e990 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Set, pItem->iCur
1e9a0 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 28  sor);.    if( ((
1e9b0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
1e9c0 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65  pe|priorJointype
1e9d0 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ) & (JT_LEFT|JT_
1e9e0 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20  CROSS))!=0 ){.  
1e9f0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 64      /* This cond
1ea00 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77 68  ition is true wh
1ea10 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65 20  en pItem is the 
1ea20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1ea30 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
1ea40 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65   right-hand-side
1ea50 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43 52   of a LEFT or CR
1ea60 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20  OSS JOIN.  */.  
1ea70 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d 50      mPrereq = mP
1ea80 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rior;.    }.    
1ea90 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d 20  priorJointype = 
1eaa0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
1eab0 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  pe;.#ifndef SQLI
1eac0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ead0 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56  ABLE.    if( IsV
1eae0 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54  irtual(pItem->pT
1eaf0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ab) ){.      str
1eb00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1eb10 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
1eb20 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70 45  =&pItem[1]; p<pE
1eb30 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
1eb40 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65 20    if( mUnusable 
1eb50 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79  || (p->fg.jointy
1eb60 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1eb70 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20 20  _CROSS)) ){.    
1eb80 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65 20        mUnusable 
1eb90 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47  |= sqlite3WhereG
1eba0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
1ebb0 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43 75  sMaskSet, p->iCu
1ebc0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  rsor);.        }
1ebd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1ebe0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1ebf0 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72  Virtual(pBuilder
1ec00 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1ec10 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  able);.    }else
1ec20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ec30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1ec40 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20  BLE */.    {.   
1ec50 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1ec60 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c 64  pAddBtree(pBuild
1ec70 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20  er, mPrereq);.  
1ec80 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1ec90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eca0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1ecb0 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
1ecc0 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1ecd0 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ble);.    }.    
1ece0 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e  mPrior |= pNew->
1ecf0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66  maskSelf;.    if
1ed00 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ( rc || db->mall
1ed10 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
1ed20 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c 6f  ;.  }..  whereLo
1ed30 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77  opClear(db, pNew
1ed40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ed50 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65  }../*.** Examine
1ed60 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77 69   a WherePath (wi
1ed70 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  th the addition 
1ed80 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68 65  of the extra Whe
1ed90 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74  reLoop of the 5t
1eda0 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29  h.** parameters)
1edb0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75   to see if it ou
1edc0 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68  tputs rows in th
1edd0 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45  e requested ORDE
1ede0 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55  R BY.** (or GROU
1edf0 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72 65  P BY) without re
1ee00 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72 61  quiring a separa
1ee10 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f  te sort operatio
1ee20 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a  n.  Return N:.**
1ee30 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20   .**   N>0:   N 
1ee40 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1ee50 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
1ee60 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20   satisfied.**   
1ee70 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20  N==0:  No terms 
1ee80 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1ee90 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
1eea0 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20  fied.**   N<0:  
1eeb0 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77   Unknown yet how
1eec0 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f   many terms of O
1eed0 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62 65  RDER BY might be
1eee0 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a 2a   satisfied.   .*
1eef0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
1ef00 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48  rocessing for WH
1ef10 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20  ERE_GROUPBY and 
1ef20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
1ef30 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74   is not as.** st
1ef40 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55  rict.  With GROU
1ef50 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
1ef60 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69  T the only requi
1ef70 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a  rement is that.*
1ef80 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  * equivalent row
1ef90 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61  s appear immedia
1efa0 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f  tely adjacent to
1efb0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47   one another.  G
1efc0 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44  ROUP BY.** and D
1efd0 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72  ISTINCT do not r
1efe0 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61  equire rows to a
1eff0 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72  ppear in any par
1f000 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73  ticular order as
1f010 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69   long.** as equi
1f020 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20  valent rows are 
1f030 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
1f040 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55  .  Thus for GROU
1f050 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  P BY and DISTINC
1f060 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42  T.** the pOrderB
1f070 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d  y terms can be m
1f080 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72  atched in any or
1f090 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52  der.  With ORDER
1f0a0 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72   BY, the .** pOr
1f0b0 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74  derBy terms must
1f0c0 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73   be matched in s
1f0d0 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69  trict left-to-ri
1f0e0 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ght order..*/.st
1f0f0 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61 74  atic i8 wherePat
1f100 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
1f110 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  y(.  WhereInfo *
1f120 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68  pWInfo,    /* Th
1f130 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1f140 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1f150 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44  rderBy,   /* ORD
1f160 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
1f170 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c  Y or DISTINCT cl
1f180 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  ause to check */
1f190 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50  .  WherePath *pP
1f1a0 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ath,     /* The 
1f1b0 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65  WherePath to che
1f1c0 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ck */.  u16 wctr
1f1d0 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
1f1e0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 6f   WHERE_GROUPBY o
1f1f0 72 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f 72  r _DISTINCTBY or
1f200 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20   _ORDERBY_LIMIT 
1f210 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20  */.  u16 nLoop, 
1f220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f230 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1f240 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  in pPath->aLoop[
1f250 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
1f260 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20   *pLast,     /* 
1f270 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f  Add this WhereLo
1f280 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  op to the end of
1f290 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
1f2a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52  */.  Bitmask *pR
1f2b0 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55  evMask     /* OU
1f2c0 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65  T: Mask of Where
1f2d0 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20  Loops to run in 
1f2e0 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
1f2f0 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b  .){.  u8 revSet;
1f300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f310 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e  rue if rev is kn
1f320 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b  own */.  u8 rev;
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f340 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74  * Composite sort
1f350 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72   order */.  u8 r
1f360 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  evIdx;          
1f370 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20    /* Index sort 
1f380 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73  order */.  u8 is
1f390 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20  OrderDistinct;  
1f3a0 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68   /* All prior Wh
1f3b0 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64  ereLoops are ord
1f3c0 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  er-distinct */. 
1f3d0 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75   u8 distinctColu
1f3e0 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  mns;   /* True i
1f3f0 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55  f the loop has U
1f400 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63  NIQUE NOT NULL c
1f410 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69  olumns */.  u8 i
1f420 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  sMatch;         
1f430 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74    /* iColumn mat
1f440 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ches a term of t
1f450 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1f460 73 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f 70  se */.  u16 eqOp
1f470 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a  Mask;         /*
1f480 20 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69 74   Allowed equalit
1f490 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  y operators */. 
1f4a0 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   u16 nKeyCol;   
1f4b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f4c0 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20   of key columns 
1f4d0 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75  in pIndex */.  u
1f4e0 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  16 nColumn;     
1f4f0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
1f500 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20  mber of ordered 
1f510 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
1f520 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f  ndex */.  u16 nO
1f530 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
1f540 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20  /* Number terms 
1f550 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
1f560 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1f570 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  iLoop;          
1f580 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68    /* Index of Wh
1f590 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68  ereLoop in pPath
1f5a0 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
1f5b0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1f5d0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1f5e0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
1f5f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1f600 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72  r number for cur
1f610 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  rent WhereLoop *
1f620 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b  /.  int iColumn;
1f630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
1f640 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
1f650 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a  hin table iCur *
1f660 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1f670 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72  Loop = 0; /* Cur
1f680 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62  rent WhereLoop b
1f690 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20  eing processed. 
1f6a0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1f6b0 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20  pTerm;     /* A 
1f6c0 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
1f6d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f6e0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78  */.  Expr *pOBEx
1f6f0 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  pr;        /* An
1f700 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
1f710 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1f720 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65  ause */.  CollSe
1f730 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
1f740 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74  /* COLLATE funct
1f750 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45  ion from an ORDE
1f760 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
1f770 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1f780 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  dex;        /* T
1f790 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  he index associa
1f7a0 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a  ted with pLoop *
1f7b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1f7c0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
1f7d0 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
1f7e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1f7f0 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74  .  Bitmask obSat
1f800 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b   = 0;    /* Mask
1f810 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
1f820 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f 20  ms satisfied so 
1f830 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  far */.  Bitmask
1f840 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f   obDone;       /
1f850 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52  * Mask of all OR
1f860 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
1f870 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44    Bitmask orderD
1f880 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a  istinctMask;  /*
1f890 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c   Mask of all wel
1f8a0 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20  l-ordered loops 
1f8b0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61  */.  Bitmask rea
1f8c0 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dy;             
1f8d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65   /* Mask of inne
1f8e0 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a  r loops */..  /*
1f8f0 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65  .  ** We say the
1f900 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f   WhereLoop is "o
1f910 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65  ne-row" if it ge
1f920 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20  nerates no more 
1f930 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f  than one.  ** ro
1f940 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20  w of output.  A 
1f950 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65  WhereLoop is one
1f960 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74  -row if all of t
1f970 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1f980 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29   true:.  **  (a)
1f990 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   All index colum
1f9a0 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57 48  ns match with WH
1f9b0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20  ERE_COLUMN_EQ.. 
1f9c0 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64   **  (b) The ind
1f9d0 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a  ex is unique.  *
1f9e0 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20  * Any WhereLoop 
1f9f0 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f  with an WHERE_CO
1fa00 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69  LUMN_EQ constrai
1fa10 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20  nt on the rowid 
1fa20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a  is one-row..  **
1fa30 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
1fa40 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61  hereLoop will ha
1fa50 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  ve the WHERE_ONE
1fa60 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20 77  ROW bit set in w
1fa70 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a  sFlags..  **.  *
1fa80 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
1fa90 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72  reLoop is "order
1faa0 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74 68  -distinct" if th
1fab0 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73  e set of columns
1fac0 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20   from.  ** that 
1fad0 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61  WhereLoop that a
1fae0 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  re in the ORDER 
1faf0 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64 69  BY clause are di
1fb00 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
1fb10 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
1fb20 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76  e WhereLoop.  Ev
1fb30 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72  ery one-row Wher
1fb40 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74  eLoop is automat
1fb50 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65  ically.  ** orde
1fb60 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20  r-distinct.   A 
1fb70 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68  WhereLoop that h
1fb80 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  as no columns in
1fb90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1fba0 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  ause.  ** is not
1fbb0 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
1fbc0 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73   To be order-dis
1fbd0 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69  tinct is not qui
1fbe0 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 62  te the same as b
1fbf0 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45  eing.  ** UNIQUE
1fc00 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20   since a UNIQUE 
1fc10 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20  column or index 
1fc20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
1fc30 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a  e rows that .  *
1fc40 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e  * are NULL and N
1fc50 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65  ULL values are e
1fc60 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68  quivalent for th
1fc70 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64  e purpose of ord
1fc80 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
1fc90 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  * To be order-di
1fca0 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75  stinct, the colu
1fcb0 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51  mns must be UNIQ
1fcc0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e  UE and NOT NULL.
1fcd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
1fce0 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65  owid for a table
1fcf0 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55   is always UNIQU
1fd00 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73  E and NOT NULL s
1fd10 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20  o whenever the. 
1fd20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72   ** rowid appear
1fd30 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1fd40 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f  Y clause, the co
1fd50 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
1fd60 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75  eLoop is.  ** au
1fd70 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65  tomatically orde
1fd80 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f  r-distinct..  */
1fd90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
1fda0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  erBy!=0 );.  if(
1fdb0 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69   nLoop && Optimi
1fdc0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1fdd0 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42  b, SQLITE_OrderB
1fde0 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75  yIdxJoin) ) retu
1fdf0 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42  rn 0;..  nOrderB
1fe00 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
1fe10 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  xpr;.  testcase(
1fe20 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31   nOrderBy==BMS-1
1fe30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72   );.  if( nOrder
1fe40 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72  By>BMS-1 ) retur
1fe50 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  n 0;  /* Cannot 
1fe60 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20  optimize overly 
1fe70 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73 20  large ORDER BYs 
1fe80 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74  */.  isOrderDist
1fe90 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f  inct = 1;.  obDo
1fea0 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72  ne = MASKBIT(nOr
1feb0 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65  derBy)-1;.  orde
1fec0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20  rDistinctMask = 
1fed0 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a  0;.  ready = 0;.
1fee0 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f 5f    eqOpMask = WO_
1fef0 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f 5f  EQ | WO_IS | WO_
1ff00 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77 63  ISNULL;.  if( wc
1ff10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1ff20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29  _ORDERBY_LIMIT )
1ff30 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f 5f   eqOpMask |= WO_
1ff40 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d  IN;.  for(iLoop=
1ff50 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  0; isOrderDistin
1ff60 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f  ct && obSat<obDo
1ff70 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f  ne && iLoop<=nLo
1ff80 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
1ff90 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20    if( iLoop>0 ) 
1ffa0 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e  ready |= pLoop->
1ffb0 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66  maskSelf;.    if
1ffc0 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29 7b  ( iLoop<nLoop ){
1ffd0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
1ffe0 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  Path->aLoop[iLoo
1fff0 70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77 63  p];.      if( wc
20000 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
20010 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29  _ORDERBY_LIMIT )
20020 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
20030 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  else{.      pLoo
20040 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 7d  p = pLast;.    }
20050 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
20060 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20070 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
20080 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
20090 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65  >u.vtab.isOrdere
200a0 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f  d ) obSat = obDo
200b0 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ne;.      break;
200c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20  .    }.    iCur 
200d0 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
200e0 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
200f0 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20  b].iCursor;..   
20100 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
20110 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58   ORDER BY term X
20120 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d   that is a colum
20130 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  n in the table o
20140 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
20150 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68  rent loop for wh
20160 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72  ich there is ter
20170 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20  m in the WHERE. 
20180 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
20190 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55  the form X IS NU
201a0 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72  LL or X=? that r
201b0 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75  eference only ou
201c0 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73  ter.    ** loops
201d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
201e0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
201f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
20200 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
20210 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
20220 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d  .      pOBExpr =
20230 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
20240 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79  Collate(pOrderBy
20250 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
20260 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
20270 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
20280 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20290 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
202a0 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
202b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54  ntinue;.      pT
202c0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
202d0 72 65 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e  reFindTerm(&pWIn
202e0 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70  fo->sWC, iCur, p
202f0 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c  OBExpr->iColumn,
20300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20310 20 20 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20          ~ready, 
20320 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20  eqOpMask, 0);.  
20330 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
20340 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20350 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
20360 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
20370 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20  {.        /* IN 
20380 74 65 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76  terms are only v
20390 61 6c 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  alid for sorting
203a0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
203b0 20 4c 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20   LIMIT .        
203c0 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ** optimization,
203d0 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69   and then only i
203e0 66 20 74 68 65 79 20 61 72 65 20 61 63 74 75 61  f they are actua
203f0 6c 6c 79 20 75 73 65 64 0a 20 20 20 20 20 20 20  lly used.       
20400 20 2a 2a 20 62 79 20 74 68 65 20 71 75 65 72 79   ** by the query
20410 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   plan */.       
20420 20 61 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c   assert( wctrlFl
20430 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
20440 52 42 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  RBY_LIMIT );.   
20450 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
20460 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  pLoop->nLTerm &&
20470 20 70 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61   pTerm!=pLoop->a
20480 4c 54 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d  LTerm[j]; j++){}
20490 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  .        if( j>=
204a0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20  pLoop->nLTerm ) 
204b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
204c0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  }.      if( (pTe
204d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57  rm->eOperator&(W
204e0 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20  O_EQ|WO_IS))!=0 
204f0 26 26 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c  && pOBExpr->iCol
20500 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
20510 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
20520 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70  , *z2;.        p
20530 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
20540 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
20550 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
20560 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
20570 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
20580 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
20590 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
205a0 20 20 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d       z1 = pColl-
205b0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
205c0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
205d0 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66  xprCollSeq(pWInf
205e0 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d  o->pParse, pTerm
205f0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
20600 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
20610 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
20620 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32  Coll;.        z2
20630 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
20640 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
20650 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
20660 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  z2)!=0 ) continu
20670 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e;.        testc
20680 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ase( pTerm->pExp
20690 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
206a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
206b0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
206c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
206d0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
206e0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
206f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
20700 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20710 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a   & WHERE_IPK ){.
20720 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
20730 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79   0;.        nKey
20740 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
20750 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20   nColumn = 1;.  
20760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
20770 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
20780 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
20790 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
207a0 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
207b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
207c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
207d0 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64    nKeyCol = pInd
207e0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  ex->nKeyCol;.   
207f0 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
20800 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
20810 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20820 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c  nColumn==nKeyCol
20830 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  +1 || !HasRowid(
20840 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20  pIndex->pTable) 
20850 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
20860 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  t( pIndex->aiCol
20870 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d  umn[nColumn-1]==
20880 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20  XN_ROWID.       
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208a0 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28     || !HasRowid(
208b0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29  pIndex->pTable))
208c0 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
208d0 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e  rDistinct = IsUn
208e0 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
208f0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
20900 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
20910 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
20920 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
20930 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
20940 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
20950 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
20960 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
20970 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20980 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
20990 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
209a0 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
209b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
209c0 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
209d0 20 20 20 20 20 75 38 20 62 4f 6e 63 65 20 3d 20       u8 bOnce = 
209e0 31 3b 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75  1; /* True to ru
209f0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
20a00 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
20a10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
20a20 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
20a30 2e 6e 45 71 20 0a 20 20 20 20 20 20 20 20 20 20  .nEq .          
20a40 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54    || (pLoop->aLT
20a50 65 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70  erm[j]==0)==(j<p
20a60 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20  Loop->nSkip).   
20a70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
20a80 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62  if( j<pLoop->u.b
20a90 74 72 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70  tree.nEq && j>=p
20aa0 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20  Loop->nSkip ){. 
20ab0 20 20 20 20 20 20 20 20 20 75 31 36 20 65 4f 70           u16 eOp
20ac0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
20ad0 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a  [j]->eOperator;.
20ae0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  .          /* Sk
20af0 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49  ip over == and I
20b00 53 20 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72  S and ISNULL ter
20b10 6d 73 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70 20  ms.  (Also skip 
20b20 49 4e 20 74 65 72 6d 73 20 77 68 65 6e 0a 20 20  IN terms when.  
20b30 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67          ** doing
20b40 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c   WHERE_ORDERBY_L
20b50 49 4d 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29  IMIT processing)
20b60 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
20b70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
20b80 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
20b90 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20   is a column of 
20ba0 61 6e 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45  an ((?,?) IN (SE
20bb0 4c 45 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20  LECT...)) .     
20bc0 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
20bd0 6f 6e 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  on for which the
20be0 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
20bf0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
20c00 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
20c10 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  ** check that it
20c20 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c   is the only col
20c30 75 6d 6e 20 75 73 65 64 20 62 79 20 74 68 69 73  umn used by this
20c40 20 6c 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65   loop. Otherwise
20c50 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  ,.          ** i
20c60 66 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74  f it is one of t
20c70 77 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65  wo or more, none
20c80 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
20c90 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20  can be.         
20ca0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74   ** considered t
20cb0 6f 20 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52  o match an ORDER
20cc0 20 42 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20   BY term.  */.  
20cd0 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
20ce0 20 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20   & eqOpMask)!=0 
20cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
20d00 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
20d10 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
20d20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
20d30 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b  OrderDistinct );
20d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20d50 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
20d60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
20d70 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  }.            co
20d80 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
20d90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
20da0 57 41 59 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e  WAYS(eOp & WO_IN
20db0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
20dc0 20 2f 2a 20 41 4c 57 41 59 53 28 29 20 6a 75 73   /* ALWAYS() jus
20dd0 74 69 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20  tification: eOp 
20de0 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20 6f  is an equality o
20df0 70 65 72 61 74 6f 72 20 64 75 65 20 74 6f 20 74  perator due to t
20e00 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
20e10 2a 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  * j<pLoop->u.btr
20e20 65 65 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e  ee.nEq constrain
20e30 74 20 61 62 6f 76 65 2e 20 20 41 6e 79 20 65 71  t above.  Any eq
20e40 75 61 6c 69 74 79 20 6f 74 68 65 72 0a 20 20 20  uality other.   
20e50 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e           ** than
20e60 20 57 4f 5f 49 4e 20 69 73 20 63 61 70 74 75 72   WO_IN is captur
20e70 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
20e80 75 73 20 22 69 66 22 2e 20 20 53 6f 20 74 68 69  us "if".  So thi
20e90 73 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20  s one.          
20ea0 20 20 2a 2a 20 61 6c 77 61 79 73 20 68 61 73 20    ** always has 
20eb0 74 6f 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a  to be WO_IN. */.
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
20ed0 20 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c   *pX = pLoop->aL
20ee0 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a  Term[j]->pExpr;.
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
20f00 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e  i=j+1; i<pLoop->
20f10 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b  u.btree.nEq; i++
20f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20f30 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   if( pLoop->aLTe
20f40 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58  rm[i]->pExpr==pX
20f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20f60 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
20f70 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65  op->aLTerm[i]->e
20f80 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
20f90 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
20fa0 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a       bOnce = 0;.
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
20ff0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
21000 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63      /* Get the c
21010 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20  olumn number in 
21020 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75  the table (iColu
21030 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64  mn) and sort ord
21040 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72  er.        ** (r
21050 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a  evIdx) for the j
21060 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
21070 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
21080 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
21090 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
210a0 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
210b0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
210c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  ];.          rev
210d0 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53  Idx = pIndex->aS
210e0 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
210f0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
21100 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  mn==pIndex->pTab
21110 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c  le->iPKey ) iCol
21120 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
21130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21140 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f     iColumn = XN_
21150 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20  ROWID;.         
21160 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20   revIdx = 0;.   
21170 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
21180 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69  /* An unconstrai
21190 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ned column that 
211a0 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65  might be NULL me
211b0 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20  ans that this.  
211c0 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f        ** WhereLo
211d0 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f  op is not well-o
211e0 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a  rdered.        *
211f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
21200 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20  OrderDistinct.  
21210 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d         && iColum
21220 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  n>=0.         &&
21230 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
21240 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
21250 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  && pIndex->pTabl
21260 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
21270 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
21280 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21290 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
212a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
212b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  .        /* Find
212c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
212d0 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  rm that correspo
212e0 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20  nds to the j-th 
212f0 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a  column.        *
21300 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  * of the index a
21310 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44  nd mark that ORD
21320 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a  ER BY term off .
21330 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21340 20 20 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a     isMatch = 0;.
21350 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
21360 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64   bOnce && i<nOrd
21370 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
21380 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
21390 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
213a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
213b0 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c     pOBExpr = sql
213c0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
213d0 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ate(pOrderBy->a[
213e0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
213f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
21400 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21410 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20  E_GROUPBY );.   
21420 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21430 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
21440 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
21450 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21460 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57  (wctrlFlags & (W
21470 48 45 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45  HERE_GROUPBY|WHE
21480 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d  RE_DISTINCTBY))=
21490 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a  =0 ) bOnce = 0;.
214a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
214b0 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20  olumn>=(-1) ){. 
214c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
214d0 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
214e0 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
214f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21500 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c  ( pOBExpr->iTabl
21510 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  e!=iCur ) contin
21520 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
21530 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
21540 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
21550 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21570 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21580 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 4f  e3ExprCompare(pO
21590 42 45 78 70 72 2c 70 49 6e 64 65 78 2d 3e 61 43  BExpr,pIndex->aC
215a0 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78  olExpr->a[j].pEx
215b0 70 72 2c 69 43 75 72 29 20 29 7b 0a 20 20 20 20  pr,iCur) ){.    
215c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
215d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
215e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
215f0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
21600 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
21610 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
21620 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
21630 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
21640 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21650 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
21660 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
21670 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
21680 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
21690 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
216a0 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
216b0 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
216c0 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
216d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
216e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
216f0 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
21700 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21720 20 69 73 4d 61 74 63 68 20 26 26 20 28 77 63 74   isMatch && (wct
21730 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21740 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20  GROUPBY)==0 ){. 
21750 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
21760 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
21770 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
21780 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
21790 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
217a0 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72 64 65      ** Sort orde
217b0 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 20  r is irrelevant 
217c0 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63  for a GROUP BY c
217d0 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20  lause. */.      
217e0 20 20 20 20 69 66 28 20 72 65 76 53 65 74 20 29      if( revSet )
217f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
21800 28 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29  ( (rev ^ revIdx)
21810 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  !=pOrderBy->a[i]
21820 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69 73 4d  .sortOrder ) isM
21830 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
21840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21850 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
21860 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
21870 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
21880 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21890 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73 6b 20  rev ) *pRevMask 
218a0 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f 6f 70  |= MASKBIT(iLoop
218b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
218c0 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  evSet = 1;.     
218d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
218e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
218f0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
21900 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58    if( iColumn==X
21910 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  N_ROWID ){.     
21920 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21930 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
21940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
21950 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
21960 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ns = 1;.        
21970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62    }.          ob
21980 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
21990 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
219a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
219b0 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f  o match found */
219c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
219d0 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c  ==0 || j<nKeyCol
219e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
219f0 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
21a00 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a  rDistinct!=0 );.
21a10 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
21a20 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
21a30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21a40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
21a60 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72  /* end Loop over
21a70 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   all index colum
21a80 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
21a90 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
21aa0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
21ab0 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
21ac0 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
21ad0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
21ae0 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ct = 1;.      }.
21af0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20      } /* end-if 
21b00 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a  not one-row */..
21b10 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
21b20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20  any other ORDER 
21b30 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65  BY terms that re
21b40 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f  ference pLoop */
21b50 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72  .    if( isOrder
21b60 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
21b70 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
21b80 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ask |= pLoop->ma
21b90 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f  skSelf;.      fo
21ba0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
21bb0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
21bc0 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20   Expr *p;.      
21bd0 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b    Bitmask mTerm;
21be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53  .        if( MAS
21bf0 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
21c00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21c10 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79      p = pOrderBy
21c20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
21c30 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73 71        mTerm = sq
21c40 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73  lite3WhereExprUs
21c50 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  age(&pWInfo->sMa
21c60 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20 20  skSet,p);.      
21c70 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26    if( mTerm==0 &
21c80 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
21c90 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63 6f  Constant(p) ) co
21ca0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21cb0 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65  if( (mTerm&~orde
21cc0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d  rDistinctMask)==
21cd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 ){.          o
21ce0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
21cf0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
21d00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
21d10 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20  /* End the loop 
21d20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f  over all WhereLo
21d30 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d  ops from outer-m
21d40 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65  ost down to inne
21d50 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20  r-most */.  if( 
21d60 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20  obSat==obDone ) 
21d70 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64 65  return (i8)nOrde
21d80 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f 72  rBy;.  if( !isOr
21d90 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
21da0 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42     for(i=nOrderB
21db0 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  y-1; i>0; i--){.
21dc0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
21dd0 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20 31  = MASKBIT(i) - 1
21de0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 53  ;.      if( (obS
21df0 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72  at&m)==m ) retur
21e00 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n i;.    }.    r
21e10 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
21e20 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  eturn -1;.}.../*
21e30 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
21e40 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73  _GROUPBY flag is
21e50 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73 6b   set in the mask
21e60 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
21e70 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 0a  e3WhereBegin(),.
21e80 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 61  ** the planner a
21e90 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
21ea0 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65 72  specified pOrder
21eb0 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75 61  By list is actua
21ec0 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42  lly a GROUP.** B
21ed0 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20 73  Y clause - and s
21ee0 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61 74  o any order that
21ef0 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73 20   groups rows as 
21f00 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66 69  required satisfi
21f10 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  es the.** reques
21f20 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  t..**.** Normall
21f30 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  y, in this case 
21f40 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
21f50 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65  le for the calle
21f60 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a  r to determine.*
21f70 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
21f80 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72 65   the rows are re
21f90 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69 76  ally being deliv
21fa0 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20 6f  ered in sorted o
21fb0 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74  rder, or.** just
21fc0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f   in some other o
21fd0 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69 64  rder that provid
21fe0 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20  es the required 
21ff0 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76 65  grouping. Howeve
22000 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48 45  r,.** if the WHE
22010 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 66  RE_SORTBYGROUP f
22020 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73 73  lag is also pass
22030 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
22040 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a  reBegin(), then.
22050 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
22060 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f   may be called o
22070 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 57  n the returned W
22080 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  hereInfo object.
22090 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74   It returns.** t
220a0 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73 20  rue if the rows 
220b0 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73  really will be s
220c0 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70 65  orted in the spe
220d0 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f 72  cified order, or
220e0 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77   false.** otherw
220f0 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ise..**.** For e
22100 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
22110 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
22120 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
22130 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  x, Y);.**.** the
22140 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  n.**.**   SELECT
22150 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50   * FROM t1 GROUP
22160 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42 59   BY x,y ORDER BY
22170 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72   x,y;   -- IsSor
22180 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45  ted()==1.**   SE
22190 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47  LECT * FROM t1 G
221a0 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44 45  ROUP BY y,x ORDE
221b0 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49  R BY y,x;   -- I
221c0 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a  sSorted()==0.*/.
221d0 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
221e0 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49 6e  IsSorted(WhereIn
221f0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61  fo *pWInfo){.  a
22200 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77  ssert( pWInfo->w
22210 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22220 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 61  E_GROUPBY );.  a
22230 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77  ssert( pWInfo->w
22240 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22250 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29 3b  E_SORTBYGROUP );
22260 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
22270 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66  ->sorted;.}..#if
22280 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
22290 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65  NABLED./* For de
222a0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
222b0 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  : */.static cons
222c0 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61 74  t char *wherePat
222d0 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68 20  hName(WherePath 
222e0 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f  *pPath, int nLoo
222f0 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  p, WhereLoop *pL
22300 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ast){.  static c
22310 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20  har zName[65];. 
22320 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22330 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29  0; i<nLoop; i++)
22340 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61  { zName[i] = pPa
22350 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49  th->aLoop[i]->cI
22360 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73 74  d; }.  if( pLast
22370 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20   ) zName[i++] = 
22380 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e  pLast->cId;.  zN
22390 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65  ame[i] = 0;.  re
223a0 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
223b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
223c0 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  rn the cost of s
223d0 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73  orting nRow rows
223e0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
223f0 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a 2a  the keys have .*
22400 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d  * nOrderby colum
22410 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ns and that the 
22420 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63 6f  first nSorted co
22430 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61 64  lumns are alread
22440 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a  y in.** order..*
22450 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20  /.static LogEst 
22460 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74  whereSortingCost
22470 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
22480 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20  WInfo,.  LogEst 
22490 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64  nRow,.  int nOrd
224a0 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72  erBy,.  int nSor
224b0 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49  ted.){.  /* TUNI
224c0 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63 6f  NG: Estimated co
224d0 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78 74  st of a full ext
224e0 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65 72  ernal sort, wher
224f0 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68 65  e N is .  ** the
22500 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
22510 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a  to sort is:.  **
22520 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28  .  **   cost = (
22530 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29  3.0 * N * log(N)
22540 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72  )..  ** .  ** Or
22550 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d 62  , if the order-b
22560 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20 74  y clause has X t
22570 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74 68  erms but only th
22580 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20 74  e last Y .  ** t
22590 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66 20  erms are out of 
225a0 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63  order, then bloc
225b0 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72  k-sorting will r
225c0 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a 20  educe the .  ** 
225d0 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a  sorting cost to:
225e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
225f0 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
22600 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20  og(N)) * (Y/X). 
22610 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f   **.  ** The (Y/
22620 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c 65  X) term is imple
22630 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74 61  mented using sta
22640 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63 61  ck variable rSca
22650 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20  le.  ** below.  
22660 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63 61  */.  LogEst rSca
22670 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20  le, rSortCost;. 
22680 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
22690 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69 74  y>0 && 66==sqlit
226a0 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b  e3LogEst(100) );
226b0 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c 69  .  rScale = sqli
226c0 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65  te3LogEst((nOrde
226d0 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30  rBy-nSorted)*100
226e0 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36 3b  /nOrderBy) - 66;
226f0 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e  .  rSortCost = n
22700 52 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20 31  Row + rScale + 1
22710 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70 6c  6;..  /* Multipl
22720 65 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65 72  e by log(M) wher
22730 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e M is the numbe
22740 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
22750 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 4c  ..  ** Use the L
22760 49 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69 74  IMIT for M if it
22770 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20   is smaller */. 
22780 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
22790 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
227a0 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20 26  _USE_LIMIT)!=0 &
227b0 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74  & pWInfo->iLimit
227c0 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52 6f  <nRow ){.    nRo
227d0 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d  w = pWInfo->iLim
227e0 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74 43  it;.  }.  rSortC
227f0 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e 52  ost += estLog(nR
22800 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 53  ow);.  return rS
22810 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ortCost;.}../*.*
22820 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
22830 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
22840 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
22850 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
22860 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
22870 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
22880 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
22890 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
228a0 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
228b0 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
228c0 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
228d0 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
228e0 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
228f0 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
22900 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
22910 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
22920 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
22930 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
22940 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
22950 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
22960 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
22970 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
22980 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
22990 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
229a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
229b0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
229c0 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
229d0 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
229e0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
229f0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
22a00 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
22a10 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
22a20 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74   *pWInfo, LogEst
22a30 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
22a40 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
22a50 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
22a60 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
22a70 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
22a80 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
22a90 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
22aa0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22ab0 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
22ac0 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
22ad0 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
22ae0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
22af0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
22b00 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
22b10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
22b20 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22b30 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22b60 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
22b70 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
22b80 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
22b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22ba0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
22bb0 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20  int mxI = 0;    
22bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
22bd0 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79  ex of next entry
22be0 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20   to replace */. 
22bf0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
22c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22c10 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
22c20 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
22c30 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74  .  LogEst mxCost
22c40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
22c50 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
22c60 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
22c70 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73  /.  LogEst mxUns
22c80 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a  orted = 0;    /*
22c90 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65   Maximum unsorte
22ca0 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  d cost of a set 
22cb0 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  of path */.  int
22cc0 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
22cd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22ce0 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
22cf0 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
22d00 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
22d10 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
22d20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
22d30 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
22d40 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
22d50 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
22d60 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
22d70 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
22d80 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
22d90 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
22da0 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
22db0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
22dc0 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
22dd0 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
22de0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
22df0 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
22e00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
22e10 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
22e20 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
22e30 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
22e40 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
22e50 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
22e60 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
22e70 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
22e80 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
22e90 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
22ea0 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
22eb0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67   memory */.  Log
22ec0 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d  Est *aSortCost =
22ed0 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e   0;    /* Sortin
22ee0 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f  g and partial so
22ef0 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20  rting costs */. 
22f00 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
22f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
22f20 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
22f30 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
22f40 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ine */.  int nSp
22f50 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
22f60 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
22f70 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  pace allocated a
22f80 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70  t pSpace */..  p
22f90 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
22fa0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
22fb0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
22fc0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
22fd0 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
22fe0 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
22ff0 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
23000 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
23010 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
23020 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
23030 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
23040 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
23050 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
23060 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
23070 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
23080 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
23090 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29  ice = (nLoop<=1)
230a0 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
230b0 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
230c0 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
230d0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
230e0 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
230f0 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
23100 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20  - begin solver. 
23110 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22   (nRowEst=%d)\n"
23120 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20  , nRowEst));..  
23130 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73  /* If nRowEst is
23140 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20   zero and there 
23150 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
23160 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74  lause, ignore it
23170 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63  . In this.  ** c
23180 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20  ase the purpose 
23190 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  of this call is 
231a0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
231b0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
231c0 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20  eturned.  ** by 
231d0 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72  the overall quer
231e0 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74  y. Once this est
231f0 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f  imate has been o
23200 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c  btained, the cal
23210 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e  ler.  ** will in
23220 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69  voke this functi
23230 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  on a second time
23240 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73  , passing the es
23250 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20  timate as the.  
23260 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d  ** nRowEst param
23270 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eter.  */.  if( 
23280 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
23290 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d  ==0 || nRowEst==
232a0 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  0 ){.    nOrderB
232b0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
232c0 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
232d0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
232e0 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f  >nExpr;.  }..  /
232f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
23300 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
23310 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61  for aTo, aFrom a
23320 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a  nd aSortCost[] *
23330 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69  /.  nSpace = (si
23340 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
23350 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
23360 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
23370 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b  ce*2;.  nSpace +
23380 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  = sizeof(LogEst)
23390 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70   * nOrderBy;.  p
233a0 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44  Space = sqlite3D
233b0 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
233c0 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
233d0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
233e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
233f0 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28 57  BKPT;.  aTo = (W
23400 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65  herePath*)pSpace
23410 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b  ;.  aFrom = aTo+
23420 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73  mxChoice;.  mems
23430 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a  et(aFrom, 0, siz
23440 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a  eof(aFrom[0]));.
23450 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f    pX = (WhereLoo
23460 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f  p**)(aFrom+mxCho
23470 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d  ice);.  for(ii=m
23480 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d  xChoice*2, pFrom
23490 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d  =aTo; ii>0; ii--
234a0 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d  , pFrom++, pX +=
234b0 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72   nLoop){.    pFr
234c0 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a  om->aLoop = pX;.
234d0 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72    }.  if( nOrder
234e0 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
234f0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
23500 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
23510 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  it is not being 
23520 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a  ignored, set up.
23530 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72      ** space for
23540 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d   the aSortCost[]
23550 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65   array. Each ele
23560 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72  ment of the aSor
23570 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20  tCost array.    
23580 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ** is either zer
23590 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68  o - meaning it h
235a0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
235b0 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72  initialized - or
235c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
235d0 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
235e0 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61  Est rows of data
235f0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
23600 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20   X terms of.    
23610 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
23620 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61  clause are alrea
23630 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65  dy in order, whe
23640 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61  re X is the arra
23650 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e  y .    ** index.
23660 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f    */.    aSortCo
23670 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58  st = (LogEst*)pX
23680 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f  ;.    memset(aSo
23690 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  rtCost, 0, sizeo
236a0 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
236b0 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73  erBy);.  }.  ass
236c0 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d  ert( aSortCost==
236d0 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
236e0 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53  ace]==(char*)&aS
236f0 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79  ortCost[nOrderBy
23700 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ] );.  assert( a
23710 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26  SortCost!=0 || &
23720 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
23730 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20  (char*)pX );..  
23740 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
23750 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
23760 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
23770 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
23780 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
23790 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
237a0 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
237b0 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
237c0 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68  above 28.  If th
237d0 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
237e0 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
237f0 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
23800 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
23810 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38  hin the first 28
23820 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
23830 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
23840 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
23850 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
23860 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
23870 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38  ->nQueryLoop, 48
23880 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d  );  assert( 48==
23890 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38  sqlite3LogEst(28
238a0 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
238b0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f  ;.  assert( aFro
238c0 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d  m[0].isOrdered==
238d0 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  0 );.  if( nOrde
238e0 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
238f0 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20   nLoop is zero, 
23900 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  then there are n
23910 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20  o FROM terms in 
23920 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65  the query. Since
23930 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
23940 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d  case the query m
23950 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69  ay return a maxi
23960 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20  mum of one row, 
23970 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
23980 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ** are already i
23990 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
239a0 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64  order. Set isOrd
239b0 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79  ered to nOrderBy
239c0 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63   to.    ** indic
239d0 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66  ate this. Or, if
239e0 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65   nLoop is greate
239f0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74  r than zero, set
23a00 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20   isOrdered to.  
23a10 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74    ** -1, indicat
23a20 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73  ing that the res
23a30 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d  ult set may or m
23a40 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65  ay not be ordere
23a50 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e  d, .    ** depen
23a60 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70  ding on the loop
23a70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
23a80 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f  urrent plan.  */
23a90 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
23aa0 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e  Ordered = nLoop>
23ab0 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42  0 ? -1 : nOrderB
23ac0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  y;.  }..  /* Com
23ad0 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
23ae0 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
23af0 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
23b00 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
23b10 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
23b20 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
23b30 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
23b40 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
23b50 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
23b60 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
23b70 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
23b80 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
23b90 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
23ba0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
23bb0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
23bc0 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
23bd0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
23be0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
23bf0 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
23c00 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
23c10 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
23c20 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
23c30 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75        LogEst nOu
23c40 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23c50 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
23c60 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f  visited by (pFro
23c70 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
23c80 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73       LogEst rCos
23c90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23ca0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
23cb0 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57  f path (pFrom+pW
23cc0 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
23cd0 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65   LogEst rUnsorte
23ce0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
23cf0 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63     /* Unsorted c
23d00 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57  ost of (pFrom+pW
23d10 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
23d20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   i8 isOrdered = 
23d30 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
23d40 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20  ;  /* isOrdered 
23d50 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  for (pFrom+pWLoo
23d60 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  p) */.        Bi
23d70 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20  tmask maskNew;  
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76  /* Mask of src v
23da0 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a  isited by (..) *
23db0 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
23dc0 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20  k revMask = 0;  
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23de0 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72  ask of rev-order
23df0 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20   loops for (..) 
23e00 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  */..        if( 
23e10 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
23e20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
23e30 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
23e40 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
23e50 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
23e60 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
23e70 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
23e80 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
23e90 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
23ea0 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
23eb0 45 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d 2d  EX)!=0 && pFrom-
23ec0 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20 20 20  >nRow<10 ){.    
23ed0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
23ee0 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  use an automatic
23ef0 20 69 6e 64 65 78 20 69 66 20 74 68 65 20 74 68   index if the th
23f00 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65 63  is loop is expec
23f10 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
23f20 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68 61   to run less tha
23f30 6e 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a 20 20  n 2 times. */.  
23f40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23f50 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
23f60 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(2) );.        
23f70 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
23f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
23f90 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
23fa0 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e 64  pWLoop is a cand
23fb0 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65 20  idate to be the 
23fc0 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20  next loop. .    
23fd0 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69      ** Compute i
23fe0 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20  ts cost */.     
23ff0 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73     rUnsorted = s
24000 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
24010 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70  pWLoop->rSetup,p
24020 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46  WLoop->rRun + pF
24030 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20  rom->nRow);.    
24040 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
24050 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
24060 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f  (rUnsorted, pFro
24070 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20  m->rUnsorted);. 
24080 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70 46         nOut = pF
24090 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f  rom->nRow + pWLo
240a0 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  op->nOut;.      
240b0 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f    maskNew = pFro
240c0 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57  m->maskLoop | pW
240d0 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  Loop->maskSelf;.
240e0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
240f0 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20  dered<0 ){.     
24100 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20 3d       isOrdered =
24110 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
24120 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
24130 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
24140 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
24150 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f  ->pOrderBy, pFro
24160 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  m, pWInfo->wctrl
24170 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4c                iL
24190 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65  oop, pWLoop, &re
241a0 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20  vMask);.        
241b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
241c0 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
241d0 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
241e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
241f0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26 26   isOrdered>=0 &&
24200 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65   isOrdered<nOrde
24210 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
24220 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b 69   if( aSortCost[i
24230 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a  sOrdered]==0 ){.
24240 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72              aSor
24250 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
24260 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43   = whereSortingC
24270 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20  ost(.           
24280 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f       pWInfo, nRo
24290 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20  wEst, nOrderBy, 
242a0 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20  isOrdered.      
242b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
242c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
242d0 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Cost = sqlite3Lo
242e0 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65  gEstAdd(rUnsorte
242f0 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f  d, aSortCost[isO
24300 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20  rdered]);..     
24310 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
24320 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20 20  0x002,.         
24330 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74       ("---- sort
24340 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f 25   cost=%-3d (%d/%
24350 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  d) increases cos
24360 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e 22  t %3d to %-3d\n"
24370 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24380 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
24390 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42 79  ered], (nOrderBy
243a0 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f 72  -isOrdered), nOr
243b0 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
243c0 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
243d0 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20 20  , rCost));.     
243e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
243f0 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e 73      rCost = rUns
24400 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  orted;.        }
24410 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
24420 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57 4c  ck to see if pWL
24430 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61 64  oop should be ad
24440 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f  ded to the set o
24450 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78 43  f.        ** mxC
24460 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66 61  hoice best-so-fa
24470 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20 20  r paths..       
24480 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
24490 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e  irst look for an
244a0 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20 61   existing path a
244b0 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  mong best-so-far
244c0 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20 2a   paths.        *
244d0 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74 68  * that covers th
244e0 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f  e same set of lo
244f0 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65 20  ops and has the 
24500 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a 20  same isOrdered. 
24510 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e         ** settin
24520 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74  g as the current
24530 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65 2e   path candidate.
24540 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
24550 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d 20      ** The term 
24560 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65  "((pTo->isOrdere
24570 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38  d^isOrdered)&0x8
24580 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76 61  0)==0" is equiva
24590 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  lent.        ** 
245a0 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  to (pTo->isOrder
245b0 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f 72  ed==(-1))==(isOr
245c0 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66 6f  dered==(-1))" fo
245d0 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20 20  r the range.    
245e0 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c 20      ** of legal 
245f0 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72 64  values for isOrd
24600 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20 20  ered, -1..64..  
24610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24620 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61   for(jj=0, pTo=a
24630 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b  To; jj<nTo; jj++
24640 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
24650 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73      if( pTo->mas
24660 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20  kLoop==maskNew. 
24670 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70            && ((p
24680 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73  To->isOrdered^is
24690 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d  Ordered)&0x80)==
246a0 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  0.          ){. 
246b0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
246c0 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29  ase( jj==nTo-1 )
246d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
246e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
246f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24700 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29     if( jj>=nTo )
24710 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
24720 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73 74  one of the exist
24730 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  ing best-so-far 
24740 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65 20  paths match the 
24750 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20 20  candidate. */.  
24760 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e          if( nTo>
24770 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20 20  =mxChoice.      
24780 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e 6d       && (rCost>m
24790 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74 3d  xCost || (rCost=
247a0 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73 6f  =mxCost && rUnso
247b0 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65 64  rted>=mxUnsorted
247c0 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
247d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
247e0 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64 69  he current candi
247f0 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74 65  date is no bette
24800 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74 68  r than any of th
24810 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  e mxChoice.     
24820 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73 20         ** paths 
24830 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
24840 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75 66   best-so-far buf
24850 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72 64  fer.  So discard
24860 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
24870 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20 61  this candidate a
24880 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a 2f  s not viable. */
24890 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
248a0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
248b0 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
248c0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
248d0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
248e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
248f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24900 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25  Skip   %s cost=%
24910 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
24920 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
24930 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
24940 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
24950 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
24960 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
24970 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
24980 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
24990 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
249a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
249b0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
249c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
249d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
249e0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
249f0 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20 6d  this points it m
24a00 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
24a10 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  w candidate path
24a20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
24a30 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64 20  eds to be added 
24a40 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
24a50 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e  st-so-far paths.
24a60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
24a70 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29  ( nTo<mxChoice )
24a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
24a90 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   Increase the si
24aa0 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65  ze of the aTo se
24ab0 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  t by one */.    
24ac0 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f          jj = nTo
24ad0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
24ae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
24af0 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70   /* New path rep
24b00 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20  laces the prior 
24b10 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f  worst to keep co
24b20 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69  unt below mxChoi
24b30 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
24b40 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20    jj = mxI;.    
24b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24b60 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d    pTo = &aTo[jj]
24b70 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
24b80 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
24b90 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
24ba0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
24bb0 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20  Trace&0x4 ){.   
24bc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24bd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65 77  DebugPrintf("New
24be0 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64      %s cost=%-3d
24bf0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
24c00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24c10 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
24c20 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
24c30 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
24c40 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
24c50 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
24c60 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
24c70 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
24c80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24c90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24ca0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
24cb0 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20  reaches here if 
24cc0 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
24cd0 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f 76   pTo=aTo[jj] cov
24ce0 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  ers the.        
24cf0 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f 66    ** same set of
24d00 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74   loops and has t
24d10 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65 64  he sam isOrdered
24d20 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 0a   setting as the.
24d30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e            ** can
24d40 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43 68  didate path.  Ch
24d50 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
24d60 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75  e candidate shou
24d70 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20  ld replace.     
24d80 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20 69       ** pTo or i
24d90 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  f the candidate 
24da0 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70 65  should be skippe
24db0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
24dc0 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43  f( pTo->rCost<rC
24dd0 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f  ost || (pTo->rCo
24de0 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54 6f  st==rCost && pTo
24df0 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29 7b  ->nRow<=nOut) ){
24e00 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
24e10 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
24e20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
24e30 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
24e40 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
24e50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24e60 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73    "Skip   %s cos
24e90 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
24ea0 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
24eb0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
24ec0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
24ed0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
24ee0 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
24f00 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
24f10 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
24f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
24f30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24f40 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73 74  f("   vs %s cost
24f50 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d 25  =%-3d,%d order=%
24f60 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
24f70 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
24f80 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
24f90 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
24fa0 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fc0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
24fd0 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
24fe0 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
25000 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
25010 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
25020 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 66  candidate path f
25030 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73  rom further cons
25040 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  ideration */.   
25050 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
25060 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
25070 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
25080 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
25090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
250a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
250b0 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
250c0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
250d0 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
250e0 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63 61  s here if the ca
250f0 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73 20  ndidate path is 
25100 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a  better than the.
25110 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
25120 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20   path.  Replace 
25130 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e  pTo with the can
25140 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65  didate. */.#ifde
25150 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25160 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
25170 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
25180 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
25190 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
251a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
251b0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
251c0 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
251d0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f   cost=%-3d,%3d o
251e0 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
251f0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
25200 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
25210 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
25220 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
25230 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
25240 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
25250 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
25260 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
25270 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25280 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25  "  was %s cost=%
25290 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
252a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
252b0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
252c0 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c  me(pTo, iLoop+1,
252d0 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c   0), pTo->rCost,
252e0 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20   pTo->nRow,.    
252f0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
25300 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
25310 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27  pTo->isOrdered+'
25320 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
25330 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
25340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25350 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77  /* pWLoop is a w
25360 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74  inner.  Add it t
25370 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73  o the set of bes
25380 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  t so far */.    
25390 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f      pTo->maskLoo
253a0 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  p = pFrom->maskL
253b0 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61  oop | pWLoop->ma
253c0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20  skSelf;.        
253d0 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72  pTo->revLoop = r
253e0 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  evMask;.        
253f0 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74  pTo->nRow = nOut
25400 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72  ;.        pTo->r
25410 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20  Cost = rCost;.  
25420 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f        pTo->rUnso
25430 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64  rted = rUnsorted
25440 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69  ;.        pTo->i
25450 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64  sOrdered = isOrd
25460 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65  ered;.        me
25470 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c  mcpy(pTo->aLoop,
25480 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73   pFrom->aLoop, s
25490 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a  izeof(WhereLoop*
254a0 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  )*iLoop);.      
254b0 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f    pTo->aLoop[iLo
254c0 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20  op] = pWLoop;.  
254d0 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d        if( nTo>=m
254e0 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
254f0 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20       mxI = 0;.  
25500 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
25510 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20   aTo[0].rCost;. 
25520 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72           mxUnsor
25530 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f  ted = aTo[0].nRo
25540 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  w;.          for
25550 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b  (jj=1, pTo=&aTo[
25560 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b  1]; jj<mxChoice;
25570 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
25580 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
25590 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74  To->rCost>mxCost
255a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
255b0 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d  | (pTo->rCost==m
255c0 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55  xCost && pTo->rU
255d0 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74  nsorted>mxUnsort
255e0 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed) .           
255f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25600 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e    mxCost = pTo->
25610 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  rCost;.         
25620 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20       mxUnsorted 
25630 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64  = pTo->rUnsorted
25640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25650 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20  mxI = jj;.      
25660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25670 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
25680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
25690 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
256a0 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a  NABLED  /* >=2 *
256b0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
256c0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
256d0 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  02 ){.      sqli
256e0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
256f0 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64  ---- after round
25700 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f   %d ----\n", iLo
25710 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  op);.      for(i
25720 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69  i=0, pTo=aTo; ii
25730 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b  <nTo; ii++, pTo+
25740 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
25750 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25760 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72   %s cost=%-3d nr
25770 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  ow=%-3d order=%c
25780 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68  ",.           wh
25790 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
257a0 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
257b0 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
257c0 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
257d0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d  pTo->isOrdered>=
257e0 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65  0 ? (pTo->isOrde
257f0 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b  red+'0') : '?');
25800 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
25810 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b  ->isOrdered>0 ){
25820 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25830 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
25840 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70  rev=0x%llx\n", p
25850 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20  To->revLoop);.  
25860 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25880 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
25890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
258a0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
258b0 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65  .    /* Swap the
258c0 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20   roles of aFrom 
258d0 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20  and aTo for the 
258e0 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20  next generation 
258f0 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61  */.    pFrom = a
25900 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46  To;.    aTo = aF
25910 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d  rom;.    aFrom =
25920 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f   pFrom;.    nFro
25930 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20  m = nTo;.  }..  
25940 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a  if( nFrom==0 ){.
25950 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25960 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
25970 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29  query solution")
25980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
25990 72 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65  reeNN(db, pSpace
259a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
259b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
259c0 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65    .  /* Find the
259d0 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
259e0 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62  h.  pFrom will b
259f0 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
25a00 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a  to that path */.
25a10 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b    pFrom = aFrom;
25a20 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c  .  for(ii=1; ii<
25a30 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nFrom; ii++){.  
25a40 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f    if( pFrom->rCo
25a50 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f  st>aFrom[ii].rCo
25a60 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46  st ) pFrom = &aF
25a70 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61  rom[ii];.  }.  a
25a80 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
25a90 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a  Level==nLoop );.
25aa0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f    /* Load the lo
25ab0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69  west cost path i
25ac0 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20  nto pWInfo */.  
25ad0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
25ae0 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
25af0 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76  +){.    WhereLev
25b00 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49  el *pLevel = pWI
25b10 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a  nfo->a + iLoop;.
25b20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f      pLevel->pWLo
25b30 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46  op = pWLoop = pF
25b40 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  rom->aLoop[iLoop
25b50 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ];.    pLevel->i
25b60 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69  From = pWLoop->i
25b70 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Tab;.    pLevel-
25b80 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66  >iTabCur = pWInf
25b90 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
25ba0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43  Level->iFrom].iC
25bb0 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  ursor;.  }.  if(
25bc0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
25bd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
25be0 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20  T_DISTINCT)!=0. 
25bf0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
25c00 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
25c10 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a  _DISTINCTBY)==0.
25c20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44     && pWInfo->eD
25c30 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44  istinct==WHERE_D
25c40 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20  ISTINCT_NOOP.   
25c50 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a  && nRowEst.  ){.
25c60 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55      Bitmask notU
25c70 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  sed;.    int rc 
25c80 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
25c90 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
25ca0 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  fo, pWInfo->pRes
25cb0 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20  ultSet, pFrom,. 
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
25ce0 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
25cf0 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
25d00 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
25d10 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d   if( rc==pWInfo-
25d20 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78  >pResultSet->nEx
25d30 70 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e  pr ){.      pWIn
25d40 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
25d50 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
25d60 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  RDERED;.    }.  
25d70 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  }.  if( pWInfo->
25d80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
25d90 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  if( pWInfo->wctr
25da0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
25db0 49 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20  ISTINCTBY ){.   
25dc0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
25dd0 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d  Ordered==pWInfo-
25de0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
25df0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
25e00 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
25e10 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
25e20 52 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a  RDERED;.      }.
25e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25e40 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20   pWInfo->nOBSat 
25e50 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72  = pFrom->isOrder
25e60 65 64 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ed;.      pWInfo
25e70 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f  ->revMask = pFro
25e80 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
25e90 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f    if( pWInfo->nO
25ea0 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20  BSat<=0 ){.     
25eb0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61     pWInfo->nOBSa
25ec0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
25ed0 66 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20  f( nLoop>0 ){.  
25ee0 20 20 20 20 20 20 20 20 75 33 32 20 77 73 46 6c          u32 wsFl
25ef0 61 67 73 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  ags = pFrom->aLo
25f00 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46  op[nLoop-1]->wsF
25f10 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
25f20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 57  if( (wsFlags & W
25f30 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20  HERE_ONEROW)==0 
25f40 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
25f50 77 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 49  wsFlags&(WHERE_I
25f60 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  PK|WHERE_COLUMN_
25f70 49 4e 29 29 21 3d 28 57 48 45 52 45 5f 49 50 4b  IN))!=(WHERE_IPK
25f80 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  |WHERE_COLUMN_IN
25f90 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
25fa0 20 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61             Bitma
25fb0 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk m = 0;.      
25fc0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
25fd0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
25fe0 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
25ff0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
26000 79 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  y, pFrom,.      
26010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26020 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
26030 4d 49 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  MIT, nLoop-1, pF
26040 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
26050 2d 31 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20  -1], &m);.      
26060 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26070 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26080 49 50 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IPK );.         
26090 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46     testcase( wsF
260a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
260b0 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  UMN_IN );.      
260c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57        if( rc==pW
260d0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
260e0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
260f0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62         pWInfo->b
26100 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
26110 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
26120 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
26130 61 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20 20 20  ask = m;.       
26140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26150 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
26170 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  f( (pWInfo->wctr
26180 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
26190 4f 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20  ORTBYGROUP).    
261a0 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e      && pWInfo->n
261b0 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70  OBSat==pWInfo->p
261c0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26  OrderBy->nExpr &
261d0 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b  & nLoop>0.    ){
261e0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72  .      Bitmask r
261f0 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  evMask = 0;.    
26200 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77    int nOrder = w
26210 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
26220 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
26230 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
26240 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  y, .          pF
26250 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c  rom, 0, nLoop-1,
26260 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
26270 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b  oop-1], &revMask
26280 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
26290 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
262a0 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  sorted==0 );.   
262b0 20 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70     if( nOrder==p
262c0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
262d0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
262e0 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64    pWInfo->sorted
262f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57   = 1;.        pW
26300 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
26310 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  revMask;.      }
26320 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70  .    }.  }...  p
26330 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
26340 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20   pFrom->nRow;.. 
26350 20 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61   /* Free tempora
26360 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65  ry memory and re
26370 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  turn success */.
26380 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
26390 4e 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20  N(db, pSpace);. 
263a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
263b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74  K;.}../*.** Most
263c0 20 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c   queries use onl
263d0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
263e0 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a   (they are not j
263f0 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a  oins) and have.*
26400 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73  * simple == cons
26410 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20  traints against 
26420 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20  indexed fields. 
26430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
26440 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61  tempts.** to pla
26450 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63  n those simple c
26460 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20  ases using much 
26470 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68  less ceremony th
26480 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61  an the.** genera
26490 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
264a0 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65  planner, and the
264b0 72 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65  reby yield faste
264c0 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
264d0 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72  e().** times for
264e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
264f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
26500 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  on-zero on succe
26510 73 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72  ss, if this quer
26520 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64  y can be handled
26530 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66   by this.** no-f
26540 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e  rills query plan
26550 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ner.  Return zer
26560 6f 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  o if this query 
26570 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65  needs the .** ge
26580 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
26590 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a  ery planner..*/.
265a0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
265b0 53 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f  ShortCut(WhereLo
265c0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
265d0 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
265e0 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72  o *pWInfo;.  str
265f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26600 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65   *pItem;.  Where
26610 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
26620 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
26630 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
26640 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  oop;.  int iCur;
26650 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c  .  int j;.  Tabl
26660 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
26670 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66   *pIdx;..  pWInf
26680 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
26690 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e  Info;.  if( pWIn
266a0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
266b0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
266c0 55 53 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  USE ) return 0;.
266d0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
266e0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
266f0 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d  >=1 );.  pItem =
26700 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
26710 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70  t->a;.  pTab = p
26720 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66  Item->pTab;.  if
26730 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
26740 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
26750 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
26760 49 6e 64 65 78 65 64 42 79 20 29 20 72 65 74 75  IndexedBy ) retu
26770 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70  rn 0;.  iCur = p
26780 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
26790 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e   pWC = &pWInfo->
267a0 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  sWC;.  pLoop = p
267b0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
267c0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
267d0 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53  = 0;.  pLoop->nS
267e0 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d  kip = 0;.  pTerm
267f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
26800 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
26810 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c  r, -1, 0, WO_EQ|
26820 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28  WO_IS, 0);.  if(
26830 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65   pTerm ){.    te
26840 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
26850 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
26860 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77   );.    pLoop->w
26870 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
26880 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49  OLUMN_EQ|WHERE_I
26890 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  PK|WHERE_ONEROW;
268a0 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  .    pLoop->aLTe
268b0 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
268c0 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d     pLoop->nLTerm
268d0 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d   = 1;.    pLoop-
268e0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31  >u.btree.nEq = 1
268f0 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  ;.    /* TUNING:
26900 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64   Cost of a rowid
26910 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f   lookup is 10 */
26920 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e  .    pLoop->rRun
26930 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73   = 33;  /* 33==s
26940 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29  qlite3LogEst(10)
26950 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
26960 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
26970 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
26980 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
26990 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73  .      int opMas
269a0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
269b0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70   pLoop->aLTermSp
269c0 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ace==pLoop->aLTe
269d0 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rm );.      if( 
269e0 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
269f0 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70  Idx).       || p
26a00 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
26a10 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  re!=0 .       ||
26a20 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41   pIdx->nKeyCol>A
26a30 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e  rraySize(pLoop->
26a40 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20  aLTermSpace) .  
26a50 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a      ) continue;.
26a60 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70        opMask = p
26a70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
26a80 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29   ? (WO_EQ|WO_IS)
26a90 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20   : WO_EQ;.      
26aa0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
26ab0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
26ac0 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
26ad0 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
26ae0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
26af0 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49  j, 0, opMask, pI
26b00 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
26b10 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
26b20 6b 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  k;.        testc
26b30 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
26b40 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
26b50 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
26b60 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72  aLTerm[j] = pTer
26b70 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
26b80 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b   if( j!=pIdx->nK
26b90 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
26ba0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  ;.      pLoop->w
26bb0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
26bc0 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f  OLUMN_EQ|WHERE_O
26bd0 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45  NEROW|WHERE_INDE
26be0 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  XED;.      if( p
26bf0 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  Idx->isCovering 
26c00 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73  || (pItem->colUs
26c10 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
26c20 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29  ndex(pIdx))==0 )
26c30 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
26c40 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
26c50 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20  E_IDX_ONLY;.    
26c60 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d    }.      pLoop-
26c70 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20  >nLTerm = j;.   
26c80 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
26c90 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20  e.nEq = j;.     
26ca0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
26cb0 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
26cc0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
26cd0 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65  Cost of a unique
26ce0 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73   index lookup is
26cf0 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f   15 */.      pLo
26d00 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20  op->rRun = 39;  
26d10 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f  /* 39==sqlite3Lo
26d20 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20  gEst(15) */.    
26d30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26d40 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
26d50 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70  wsFlags ){.    p
26d60 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f  Loop->nOut = (Lo
26d70 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e  gEst)1;.    pWIn
26d80 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20  fo->a[0].pWLoop 
26d90 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61 73 73  = pLoop;.    ass
26da0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 4d 61  ert( pWInfo->sMa
26db0 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20 69 43  skSet.n==1 && iC
26dc0 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  ur==pWInfo->sMas
26dd0 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a 20 20  kSet.ix[0] );.  
26de0 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c    pLoop->maskSel
26df0 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69 74 65  f = 1; /* sqlite
26e00 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
26e10 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
26e20 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 70   iCur); */.    p
26e30 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62  WInfo->a[0].iTab
26e40 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Cur = iCur;.    
26e50 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
26e60 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49  = 1;.    if( pWI
26e70 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  nfo->pOrderBy ) 
26e80 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
26e90 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
26ea0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  By->nExpr;.    i
26eb0 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
26ec0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
26ed0 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
26ee0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
26ef0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
26f00 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a  ISTINCT_UNIQUE;.
26f10 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
26f20 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c  ITE_DEBUG.    pL
26f30 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a  oop->cId = '0';.
26f40 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
26f50 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
26f60 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
26f70 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
26f80 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
26f90 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
26fa0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
26fb0 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
26fc0 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
26fd0 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
26fe0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
26ff0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
27000 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
27010 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
27020 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
27030 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
27040 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
27050 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
27060 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
27070 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
27080 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
27090 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
270a0 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
270b0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
270c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
270d0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
270e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
270f0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
27100 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
27110 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
27120 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
27130 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
27140 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
27150 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
27160 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
27170 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
27180 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
27190 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
271a0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
271b0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
271c0 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
271d0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
271e0 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
271f0 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
27200 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
27210 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
27220 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
27230 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
27240 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
27250 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
27260 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
27270 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
27280 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
27290 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
272a0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
272b0 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
272c0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
272d0 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
272e0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
272f0 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
27300 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
27310 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
27340 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
27350 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
27370 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
27380 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
27390 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
273a0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
273b0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
273c0 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
273d0 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
273e0 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
273f0 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
27400 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
27410 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
27420 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
27430 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
27440 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
27450 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
27460 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
27470 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
27480 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
27490 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
274a0 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
274b0 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
274c0 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
274d0 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
274e0 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
274f0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
27500 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
27510 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
27520 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
27530 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
27540 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
27550 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
27560 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
27570 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
27580 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
27590 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
275a0 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
275b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
275c0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
275d0 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
275e0 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
275f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
27600 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
27610 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
27620 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
27630 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
27640 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
27650 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
27660 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
27670 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
27680 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
27690 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
276a0 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
276b0 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
276c0 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
276d0 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
276e0 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
276f0 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
27700 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
27710 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
27720 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
27730 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
27740 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
27750 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
27760 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
27770 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
27780 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
27790 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
277a0 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
277b0 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
277c0 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
277d0 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
277e0 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
277f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
27800 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
27810 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
27820 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
27830 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
27840 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
27850 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
27860 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
27870 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
27880 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
27890 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
278a0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
278b0 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
278c0 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
278d0 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
278e0 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
278f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
27900 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
27910 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
27920 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
27930 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
27940 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
27950 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
27960 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
27970 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
27980 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
27990 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
279a0 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
279b0 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
279c0 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
279d0 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
279e0 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
279f0 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
27a00 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
27a10 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
27a20 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
27a30 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
27a40 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
27a50 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
27a60 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
27a70 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
27a80 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
27a90 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
27aa0 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
27ab0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
27ac0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
27ad0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
27ae0 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
27af0 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
27b00 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
27b10 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
27b20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
27b30 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
27b40 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
27b50 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
27b60 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
27b70 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
27b80 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
27b90 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
27ba0 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
27bb0 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
27bc0 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
27bd0 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
27be0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
27bf0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
27c00 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20   clause (or the 
27c10 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
27c20 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
27c30 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
27c40 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67  set in wctrlFlag
27c50 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  s) of a SELECT s
27c60 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74  tatement.** if t
27c70 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
27c80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
27c90 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
27ca0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
27cb0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
27cc0 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
27cd0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
27ce0 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69   then pOrderBy i
27cf0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
27d00 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65  e iIdxCur parame
27d10 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  ter is the curso
27d20 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
27d30 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48  ndex.  If .** WH
27d40 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
27d50 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72   is set, iIdxCur
27d60 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
27d70 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
27d80 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20  x.** to use for 
27d90 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
27da0 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45  sing.  The WHERE
27db0 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75   clause should u
27dc0 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69  se this.** speci
27dd0 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20  fic cursor.  If 
27de0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
27df0 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68  SIRED is set, th
27e00 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a  en iIdxCur is.**
27e10 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   the first curso
27e20 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
27e30 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c   cursors for all
27e40 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43   indices.  iIdxC
27e50 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ur should.** be 
27e60 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
27e70 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
27e80 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67  cursor depending
27e90 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   on which index 
27ea0 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57  is.** used..*/.W
27eb0 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
27ec0 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
27ed0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
27ee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
27ef0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
27f00 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
27f10 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  ist,      /* FRO
27f20 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
27f30 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
27f40 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
27f50 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
27f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27f70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
27f80 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
27f90 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e  derBy,     /* An
27fa0 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
27fb0 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20  OUP BY) clause, 
27fc0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
27fd0 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65  rList *pResultSe
27fe0 74 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 72 65  t,   /* Query re
27ff0 73 75 6c 74 20 73 65 74 2e 20 20 52 65 71 27 64  sult set.  Req'd
28000 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f   for DISTINCT */
28010 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
28020 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  s,         /* Th
28030 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
28040 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
28050 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
28060 69 41 75 78 41 72 67 20 20 20 20 20 20 20 20 20  iAuxArg         
28070 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
28080 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20  OR_SUBCLAUSE is 
28090 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
280a0 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
280b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280c0 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55     ** If WHERE_U
280d0 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74  SE_LIMIT, then t
280e0 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20  he limit amount 
280f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
28100 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eWInfo;         
28110 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73     /* Num. bytes
28120 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57   allocated for W
28130 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20  hereInfo struct 
28140 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  */.  int nTabLis
28150 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
28160 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
28170 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73  ments in pTabLis
28180 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
28190 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
281a0 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
281b0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
281c0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
281d0 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
281e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
281f0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
28200 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
28210 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
28220 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
28230 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61    /* Cursors tha
28240 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f  t are not yet po
28250 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68  sitioned */.  Wh
28260 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
28270 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  WLB;     /* The 
28280 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65  WhereLoop builde
28290 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  r */.  WhereMask
282a0 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
282b0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
282c0 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
282d0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
282e0 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  evel;        /* 
282f0 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
28300 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f  n pWInfo->a[] */
28310 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
28320 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  oop;          /*
28330 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
28340 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ngle WhereLoop o
28350 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
28360 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
28370 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28380 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
28390 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
283a0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
283b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
283c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
283e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
283f0 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d   u8 bFordelete =
28400 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f   0;         /* O
28410 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20  PFLAG_FORDELETE 
28420 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72  or zero, as appr
28430 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73  opriate */..  as
28440 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
28450 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
28460 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c  S_MULTIROW)==0 |
28470 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77 63 74  | (.        (wct
28480 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28490 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
284a0 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77 63  !=0 .     && (wc
284b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
284c0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
284d0 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f  0 .  ));..  /* O
284e0 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45  nly one of WHERE
284f0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72  _OR_SUBCLAUSE or
28500 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
28510 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
28520 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28530 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
28540 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
28550 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  | (wctrlFlags & 
28560 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
28570 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72  ==0 );..  /* Var
28580 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
28590 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
285a0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
285b0 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
285c0 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20  zeof(sWLB));..  
285d0 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55  /* An ORDER/GROU
285e0 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d  P BY clause of m
285f0 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d  ore than 63 term
28600 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  s cannot be opti
28610 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63  mized */.  testc
28620 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26  ase( pOrderBy &&
28630 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
28640 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
28650 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
28660 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d  derBy->nExpr>=BM
28670 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30  S ) pOrderBy = 0
28680 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
28690 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
286a0 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
286b0 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
286c0 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
286d0 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
286e0 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
286f0 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
28700 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
28710 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
28720 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
28730 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
28740 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
28750 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
28760 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
28770 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
28780 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
28790 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
287a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
287b0 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
287c0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
287d0 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
287e0 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
287f0 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
28800 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
28810 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
28820 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
28830 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28840 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
28850 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
28860 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
28870 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
28880 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
28890 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
288a0 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
288b0 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
288c0 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
288d0 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
288e0 65 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  e WHERE_OR_SUBCL
288f0 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74  AUSE flag is set
28900 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
28910 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
28920 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
28930 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
28940 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
28950 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
28960 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
28970 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
28980 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
28990 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
289a0 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
289b0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
289c0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
289d0 45 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  E) ? 1 : pTabLis
289e0 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
289f0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
28a00 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
28a10 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
28a20 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
28a30 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
28a40 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
28a50 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
28a60 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
28a70 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
28a80 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
28a90 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
28aa0 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
28ab0 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
28ac0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
28ad0 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
28ae0 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
28af0 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
28b00 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
28b10 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
28b20 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
28b30 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
28b40 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
28b50 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
28b60 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
28b70 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
28b80 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
28b90 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
28ba0 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
28bb0 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
28bc0 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
28bd0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
28be0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
28bf0 4e 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f  N(db, nByteWInfo
28c00 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   + sizeof(WhereL
28c10 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  oop));.  if( db-
28c20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
28c30 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
28c40 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
28c50 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a      pWInfo = 0;.
28c60 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
28c70 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
28c80 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
28c90 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
28ca0 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
28cb0 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
28cc0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
28cd0 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d  derBy;.  pWInfo-
28ce0 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
28cf0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  ;.  pWInfo->pRes
28d00 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74  ultSet = pResult
28d10 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61  Set;.  pWInfo->a
28d20 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
28d30 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
28d40 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20  ePass[1] = -1;. 
28d50 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
28d60 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
28d70 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70  Info->iBreak = p
28d80 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
28d90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
28da0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
28db0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
28dc0 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
28dd0 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20   pWInfo->iLimit 
28de0 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 70 57 49  = iAuxArg;.  pWI
28df0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
28e00 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
28e10 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65 6d  QueryLoop;.  mem
28e20 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f 42  set(&pWInfo->nOB
28e30 53 61 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  Sat, 0, .       
28e40 20 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65    offsetof(Where
28e50 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66 73  Info,sWC) - offs
28e60 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 6e  etof(WhereInfo,n
28e70 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73 65  OBSat));.  memse
28e80 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c  t(&pWInfo->a[0],
28e90 20 30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65   0, sizeof(Where
28ea0 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a 73  Loop)+nTabList*s
28eb0 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
28ec0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  ));.  assert( pW
28ed0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
28ee0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20  ONEPASS_OFF );  
28ef0 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75  /* ONEPASS defau
28f00 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20  lts to OFF */.  
28f10 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e  pMaskSet = &pWIn
28f20 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20  fo->sMaskSet;.  
28f30 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57  sWLB.pWInfo = pW
28f40 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43  Info;.  sWLB.pWC
28f50 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
28f60 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28  .  sWLB.pNew = (
28f70 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68  WhereLoop*)(((ch
28f80 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74  ar*)pWInfo)+nByt
28f90 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eWInfo);.  asser
28fa0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
28fb0 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65  IGNMENT(sWLB.pNe
28fc0 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  w) );.  whereLoo
28fd0 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29  pInit(sWLB.pNew)
28fe0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
28ff0 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65  DEBUG.  sWLB.pNe
29000 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65  w->cId = '*';.#e
29010 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  ndif..  /* Split
29020 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29030 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
29040 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
29050 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
29060 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
29070 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
29080 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
29090 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
290a0 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71  (pMaskSet);.  sq
290b0 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
290c0 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Init(&pWInfo->sW
290d0 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71  C, pWInfo);.  sq
290e0 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74 28  lite3WhereSplit(
290f0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
29100 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  here, TK_AND);. 
29110 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
29120 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
29130 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
29140 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
29150 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
29160 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
29170 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
29180 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
29190 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
291a0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c  for(ii=0; ii<sWL
291b0 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69  B.pWC->nTerm; ii
291c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61  ++){.    if( nTa
291d0 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  bList==0 || sqli
291e0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
291f0 74 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57  tNotJoin(sWLB.pW
29200 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20  C->a[ii].pExpr) 
29210 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29220 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
29230 73 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b  se, sWLB.pWC->a[
29240 69 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66  ii].pExpr, pWInf
29250 6f 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20  o->iBreak,.     
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49      SQLITE_JUMPI
29280 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57  FNULL);.      sW
29290 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74  LB.pWC->a[ii].wt
292a0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
292b0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  DED;.    }.  }..
292c0 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
292d0 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73  e: No FROM claus
292e0 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61  e.  */.  if( nTa
292f0 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  bList==0 ){.    
29300 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
29310 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
29320 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
29330 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c  .    if( wctrlFl
29340 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
29350 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
29360 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
29370 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
29380 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
29390 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
293a0 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20  sign a bit from 
293b0 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65  the bitmask to e
293c0 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
293d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
293e0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68  **.  ** The N-th
293f0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
29400 4d 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69  M clause is assi
29410 67 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f  gned a bitmask o
29420 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  f 1<<N..  **.  *
29430 2a 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74 68  * The rule of th
29440 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
29450 6e 63 65 20 65 6e 73 75 72 65 73 20 74 68 74 61  nce ensures thta
29460 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
29470 6d 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20  mask for.  ** a 
29480 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d  table T, then X-
29490 31 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b  1 is the bitmask
294a0 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74   for all other t
294b0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
294c0 74 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f  t of T..  ** Kno
294d0 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b  wing the bitmask
294e0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
294f0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
29500 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20   left join is.  
29510 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54  ** important.  T
29520 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a  icket #3015..  *
29530 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
29540 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72   bitmasks are cr
29550 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54  eated for all pT
29560 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62  abList->nSrc tab
29570 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62  les in.  ** pTab
29580 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74  List, not just t
29590 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73  he first nTabLis
295a0 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c  t tables.  nTabL
295b0 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ist is normally.
295c0 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54    ** equal to pT
295d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74  abList->nSrc but
295e0 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
295f0 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a  ned to 1 if the.
29600 20 20 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55    ** WHERE_OR_SU
29610 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20  BCLAUSE flag is 
29620 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  set..  */.  for(
29630 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73  ii=0; ii<pTabLis
29640 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a  t->nSrc; ii++){.
29650 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
29660 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
29670 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
29680 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  );.    sqlite3Wh
29690 65 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70  ereTabFuncArgs(p
296a0 50 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74  Parse, &pTabList
296b0 2d 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f  ->a[ii], &pWInfo
296c0 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64  ->sWC);.  }.#ifd
296d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
296e0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
296f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
29700 69 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  i++){.    Bitmas
29710 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  k m = sqlite3Whe
29720 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  reGetMask(pMaskS
29730 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
29740 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
29750 20 20 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53    assert( m==MAS
29760 4b 42 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a  KBIT(ii) );.  }.
29770 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
29780 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
29790 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
297a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
297b0 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61  eExprAnalyze(pTa
297c0 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e  bList, &pWInfo->
297d0 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  sWC);.  if( db->
297e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
297f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
29800 72 6f 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72  ror;..  if( wctr
29810 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
29820 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
29830 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e      if( isDistin
29840 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
29850 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70  se, pTabList, &p
29860 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73  WInfo->sWC, pRes
29870 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  ultSet) ){.     
29880 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
29890 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
298a0 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
298b0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
298c0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
298d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
298e0 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
298f0 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
29900 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
29910 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
29920 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
29930 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
29940 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
29950 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
29960 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
29970 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
29980 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
29990 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74  rderBy = pResult
299a0 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Set;.    }.  }..
299b0 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
299c0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
299d0 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69  ects */.#if defi
299e0 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
299f0 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71  NABLED).  if( sq
29a00 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
29a10 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  & 0xffff ){.    
29a20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
29a30 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  tf("*** Optimize
29a40 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74  r Start *** (wct
29a50 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77  rlFlags: 0x%x",w
29a60 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
29a70 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
29a80 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
29a90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29aa0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20  3DebugPrintf(", 
29ab0 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78  limit: %d", iAux
29ac0 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
29ad0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
29ae0 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20  tf(")\n");.  }. 
29af0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
29b00 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  eTrace & 0x100 )
29b10 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c  { /* Display all
29b20 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
29b30 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
29b40 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
29b50 61 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70  ausePrint(sWLB.p
29b60 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  WC);.  }.#endif.
29b70 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21  .  if( nTabList!
29b80 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74  =1 || whereShort
29b90 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b  Cut(&sWLB)==0 ){
29ba0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
29bb0 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29  oopAddAll(&sWLB)
29bc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
29bd0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
29be0 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57  ror;.  .#ifdef W
29bf0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
29c00 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
29c10 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20  3WhereTrace ){  
29c20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
29c30 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
29c40 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20  p objects */.   
29c50 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
29c60 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
29c70 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
29c80 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d   char zLabel[] =
29c90 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
29ca0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
29cb0 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20  uvwyxz".        
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
29cf0 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
29d00 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ";.      for(p=p
29d10 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69  WInfo->pLoops, i
29d20 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  =0; p; p=p->pNex
29d30 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20  tLoop, i++){.   
29d40 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c       p->cId = zL
29d50 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a 4c  abel[i%sizeof(zL
29d60 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20 20  abel)];.        
29d70 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
29d80 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
29d90 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
29da0 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50 61  f.  .    wherePa
29db0 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
29dc0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
29dd0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29de0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
29df0 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57  rror;.    if( pW
29e00 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29  Info->pOrderBy )
29e10 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50 61  {.       wherePa
29e20 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c  thSolver(pWInfo,
29e30 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
29e40 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  +1);.       if( 
29e50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29e60 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
29e70 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
29e80 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d   }.  if( pWInfo-
29e90 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
29ea0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
29eb0 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
29ec0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49  )!=0 ){.     pWI
29ed0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41  nfo->revMask = A
29ee0 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66  LLBITS;.  }.  if
29ef0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
29f00 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
29f10 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
29f20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
29f30 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
29f40 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
29f50 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
29f60 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
29f70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
29f80 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
29f90 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
29fa0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
29fb0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
29fc0 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ->nOBSat>0 ){.  
29fd0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
29fe0 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59  Printf(" ORDERBY
29ff0 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49  =%d,0x%llx", pWI
2a000 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49  nfo->nOBSat, pWI
2a010 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20  nfo->revMask);. 
2a020 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
2a030 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2a040 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ct ){.      case
2a050 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2a060 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
2a070 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2a080 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
2a090 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20  =unique");.     
2a0a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a0b0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
2a0c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2a0d0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
2a0e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2a0f0 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72  f("  DISTINCT=or
2a100 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
2a110 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a120 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
2a130 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2a140 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  RED: {.        s
2a150 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2a160 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e  f("  DISTINCT=un
2a170 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
2a180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a190 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
2a1a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2a1b0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  \n");.    for(ii
2a1c0 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e  =0; ii<pWInfo->n
2a1d0 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20  Level; ii++){.  
2a1e0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
2a1f0 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  nt(pWInfo->a[ii]
2a200 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57  .pWLoop, sWLB.pW
2a210 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  C);.    }.  }.#e
2a220 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70  ndif.  /* Attemp
2a230 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73  t to omit tables
2a240 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74   from the join t
2a250 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63  hat do not effec
2a260 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  t the result */.
2a270 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
2a280 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52  evel>=2.   && pR
2a290 65 73 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26  esultSet!=0.   &
2a2a0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2a2b0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2a2c0 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20  _OmitNoopJoin). 
2a2d0 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
2a2e0 74 61 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65  tabUsed = sqlite
2a2f0 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
2a300 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
2a310 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
2a320 66 28 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79  f( sWLB.pOrderBy
2a330 20 29 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65   ){.      tabUse
2a340 64 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72  d |= sqlite3Wher
2a350 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
2a360 4d 61 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f  MaskSet, sWLB.pO
2a370 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20  rderBy);.    }. 
2a380 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
2a390 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
2a3a0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2a3b0 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
2a3c0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
2a3d0 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
2a3e0 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
2a3f0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
2a400 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
2a410 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a  Loop->iTab].fg.j
2a420 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
2a430 54 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  T)==0 ) break;. 
2a440 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
2a450 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
2a460 54 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20  T_DISTINCT)==0. 
2a470 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d        && (pLoop-
2a480 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2a490 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20  _ONEROW)==0.    
2a4a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
2a4b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2a4c0 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
2a4d0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2a4e0 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a4f0 20 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e      pEnd = sWLB.
2a500 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57  pWC->a + sWLB.pW
2a510 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  C->nTerm;.      
2a520 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70  for(pTerm=sWLB.p
2a530 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e  WC->a; pTerm<pEn
2a540 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
2a550 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
2a560 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
2a570 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  op->maskSelf)!=0
2a580 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78  .         && !Ex
2a590 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
2a5a0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
2a5b0 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20  romJoin).       
2a5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
2a5d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2a5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a5f0 20 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72   pTerm<pEnd ) br
2a600 65 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45  eak;.      WHERE
2a610 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
2a620 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20  -> drop loop %c 
2a630 6e 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f  not used\n", pLo
2a640 6f 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20  op->cId));.     
2a650 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d   pWInfo->nLevel-
2a660 2d 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73  -;.      nTabLis
2a670 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t--;.    }.  }. 
2a680 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66   WHERETRACE(0xff
2a690 66 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ff,("*** Optimiz
2a6a0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
2a6b0 6e 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  n"));.  pWInfo->
2a6c0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2a6d0 6f 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52  op += pWInfo->nR
2a6e0 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  owOut;..  /* If 
2a6f0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
2a700 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2a710 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
2a720 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
2a730 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
2a740 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
2a750 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
2a760 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
2a770 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2a780 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2a790 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2a7a0 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
2a7b0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
2a7c0 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
2a7d0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2a7e0 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2a7f0 29 7b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  ){.    int wsFla
2a800 67 73 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  gs = pWInfo->a[0
2a810 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ].pWLoop->wsFlag
2a820 73 3b 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72  s;.    int bOner
2a830 6f 77 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  ow = (wsFlags & 
2a840 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30  WHERE_ONEROW)!=0
2a850 3b 0a 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f  ;.    if( bOnero
2a860 77 0a 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72  w.     || ((wctr
2a870 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2a880 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
2a890 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
2a8a0 26 20 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20  & 0==(wsFlags & 
2a8b0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
2a8c0 4c 45 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  LE)).    ){.    
2a8d0 20 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61    pWInfo->eOnePa
2a8e0 73 73 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f  ss = bOnerow ? O
2a8f0 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20  NEPASS_SINGLE : 
2a900 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20  ONEPASS_MULTI;. 
2a910 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
2a920 64 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  d(pTabList->a[0]
2a930 2e 70 54 61 62 29 20 26 26 20 28 77 73 46 6c 61  .pTab) && (wsFla
2a940 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2a950 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NLY) ){.        
2a960 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2a970 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d   WHERE_ONEPASS_M
2a980 55 4c 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20  ULTIROW ){.     
2a990 20 20 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20       bFordelete 
2a9a0 3d 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  = OPFLAG_FORDELE
2a9b0 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  TE;.        }.  
2a9c0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b        pWInfo->a[
2a9d0 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
2a9e0 67 73 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20  gs = (wsFlags & 
2a9f0 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29  ~WHERE_IDX_ONLY)
2aa00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2aa10 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2aa20 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2aa30 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
2aa40 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
2aa50 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
2aa60 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
2aa70 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2aa80 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2aa90 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69  fo->a; ii<nTabLi
2aaa0 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c  st; ii++, pLevel
2aab0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2aac0 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
2aad0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2aae0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
2aaf0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
2ab00 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2ab10 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
2ab20 2f 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  /.    struct Src
2ab30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
2ab40 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74  tem;..    pTabIt
2ab50 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2ab60 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2ab70 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
2ab80 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2ab90 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2aba0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
2abb0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2abc0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
2abd0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
2abe0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2abf0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2ac00 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
2ac10 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2ac20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
2ac30 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
2ac40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ac50 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2ac60 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
2ac70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2ac80 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
2ac90 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2aca0 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
2acb0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
2acc0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
2acd0 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
2ace0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
2acf0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
2ad00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2ad10 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
2ad20 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
2ad30 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
2ad40 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
2ad50 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
2ad60 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20    /* noop */.   
2ad70 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2ad80 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2ad90 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
2ada0 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
2adb0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2adc0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
2add0 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20  BCLAUSE)==0 ){. 
2ade0 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
2adf0 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
2ae00 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e   if( pWInfo->eOn
2ae10 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f  ePass!=ONEPASS_O
2ae20 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  FF ){.        op
2ae30 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   = OP_OpenWrite;
2ae40 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
2ae50 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d  >aiCurOnePass[0]
2ae60 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2ae70 72 73 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20  rsor;.      };. 
2ae80 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
2ae90 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
2aea0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
2aeb0 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
2aec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2aed0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2aee0 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  ==pLevel->iTabCu
2aef0 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  r );.      testc
2af00 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ase( pWInfo->eOn
2af10 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
2af20 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  FF && pTab->nCol
2af30 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
2af40 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
2af50 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
2af60 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62  PASS_OFF && pTab
2af70 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
2af80 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2af90 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2afa0 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e  SS_OFF && pTab->
2afb0 6e 43 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52  nCol<BMS && HasR
2afc0 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
2afd0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
2afe0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
2aff0 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
2b000 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
2b010 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
2b020 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
2b030 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2b040 65 50 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54  eP4(v, -1, SQLIT
2b050 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
2b060 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
2b070 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
2b080 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
2b090 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2b0a0 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
2b0b0 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28  _HINTS.      if(
2b0c0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2b0d0 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
2b0e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b0f0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
2b100 41 47 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65  AG_SEEKEQ|bForde
2b110 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lete);.      }el
2b120 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2b130 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b140 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2b150 20 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20   bFordelete);.  
2b160 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2b170 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
2b180 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
2b190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b1a0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
2b1b0 6c 75 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49  lumnsUsed, pTabI
2b1c0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c  tem->iCursor, 0,
2b1d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 28 63 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62  (const u8*)&pTab
2b200 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50  Item->colUsed, P
2b210 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66  4_INT64);.#endif
2b220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b230 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
2b240 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
2b250 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
2b260 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
2b270 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
2b280 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2b290 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  E_INDEXED ){.   
2b2a0 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
2b2b0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2b2c0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74  Index;.      int
2b2d0 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
2b2e0 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
2b2f0 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a  enRead;.      /*
2b300 20 69 41 75 78 41 72 67 20 69 73 20 61 6c 77 61   iAuxArg is alwa
2b310 79 73 20 73 65 74 20 69 66 20 74 6f 20 61 20 70  ys set if to a p
2b320 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
2b330 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73   ONEPASS is poss
2b340 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ible */.      as
2b350 73 65 72 74 28 20 69 41 75 78 41 72 67 21 3d 30  sert( iAuxArg!=0
2b360 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   || (pWInfo->wct
2b370 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2b380 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2b390 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2b3a0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2b3b0 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79   && IsPrimaryKey
2b3c0 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20 20  Index(pIx).     
2b3d0 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
2b3e0 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
2b3f0 4c 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20  LAUSE)!=0.      
2b400 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2b410 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f  is is one term o
2b420 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61  f an OR-optimiza
2b430 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50  tion using the P
2b440 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a  RIMARY KEY of a.
2b450 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f          ** WITHO
2b460 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
2b470 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73   No need for a s
2b480 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f  eparate index */
2b490 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2b4a0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
2b4b0 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70  bCur;.        op
2b4c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2b4d0 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f  e if( pWInfo->eO
2b4e0 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
2b4f0 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49  OFF ){.        I
2b500 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49  ndex *pJ = pTabI
2b510 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  tem->pTab->pInde
2b520 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65  x;.        iInde
2b530 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a  xCur = iAuxArg;.
2b540 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b550 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b560 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2b570 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  ED );.        wh
2b580 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20  ile( ALWAYS(pJ) 
2b590 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20  && pJ!=pIx ){.  
2b5a0 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2b5b0 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r++;.          p
2b5c0 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20  J = pJ->pNext;. 
2b5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b5e0 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69   op = OP_OpenWri
2b5f0 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  te;.        pWIn
2b600 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
2b610 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b  [1] = iIndexCur;
2b620 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2b630 20 69 41 75 78 41 72 67 20 26 26 20 28 77 63 74   iAuxArg && (wct
2b640 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2b650 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30  OR_SUBCLAUSE)!=0
2b660 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64   ){.        iInd
2b670 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b  exCur = iAuxArg;
2b680 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  .        op = OP
2b690 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20  _ReopenIdx;.    
2b6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b6b0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61   iIndexCur = pPa
2b6c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2b6d0 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65     }.      pLeve
2b6e0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e  l->iIdxCur = iIn
2b6f0 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73  dexCur;.      as
2b700 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65  sert( pIx->pSche
2b710 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
2b720 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  a );.      asser
2b730 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20  t( iIndexCur>=0 
2b740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20  );.      if( op 
2b750 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2b760 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2b770 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70  op, iIndexCur, p
2b780 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  Ix->tnum, iDb);.
2b790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b7a0 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
2b7b0 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
2b7c0 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70        if( (pLoop
2b7d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2b7e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30  E_CONSTRAINT)!=0
2b7f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4c  .         && (pL
2b800 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
2b810 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
2b820 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41  GE|WHERE_SKIPSCA
2b830 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  N))==0.         
2b840 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
2b850 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
2b860 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20  ERBY_MIN)==0.   
2b870 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b880 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2b890 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
2b8a0 53 45 45 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74  SEEKEQ); /* Hint
2b8b0 20 74 6f 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20   to COMDB2 */.  
2b8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b8d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2b8e0 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
2b8f0 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
2b900 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2b910 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20  USED_MASK.      
2b920 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36    {.          u6
2b930 34 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20  4 colUsed = 0;. 
2b940 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 2c           int ii,
2b950 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66   jj;.          f
2b960 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d  or(ii=0; ii<pIx-
2b970 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  >nColumn; ii++){
2b980 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
2b990 3d 20 70 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pIx->aiColumn[
2b9a0 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii];.           
2b9b0 20 69 66 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74   if( jj<0 ) cont
2b9c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2b9d0 20 20 69 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a    if( jj>63 ) jj
2b9e0 20 3d 20 36 33 3b 0a 20 20 20 20 20 20 20 20 20   = 63;.         
2b9f0 20 20 20 69 66 28 20 28 70 54 61 62 49 74 65 6d     if( (pTabItem
2ba00 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
2ba10 42 49 54 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f  BIT(jj))==0 ) co
2ba20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ba30 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28      colUsed |= (
2ba40 28 75 36 34 29 31 29 3c 3c 28 69 69 3c 36 33 20  (u64)1)<<(ii<63 
2ba50 3f 20 69 69 20 3a 20 36 33 29 3b 0a 20 20 20 20  ? ii : 63);.    
2ba60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ba70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ba80 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
2ba90 6c 75 6d 6e 73 55 73 65 64 2c 20 69 49 6e 64 65  lumnsUsed, iInde
2baa0 78 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  xCur, 0, 0,.    
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 28 75 38 2a              (u8*
2bad0 29 26 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e  )&colUsed, P4_IN
2bae0 54 36 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  T64);.        }.
2baf0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2bb00 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
2bb10 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20  SED_MASK */.    
2bb20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2bb30 28 20 69 44 62 3e 3d 30 20 29 20 73 71 6c 69 74  ( iDb>=0 ) sqlit
2bb40 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
2bb50 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
2bb60 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
2bb70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
2bb80 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2bb90 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2bba0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
2bbb0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2bbc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
2bbd0 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
2bbe0 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
2bbf0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
2bc00 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
2bc10 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
2bc20 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
2bc30 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
2bc40 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
2bc50 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
2bc60 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
2bc70 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  )0;.  for(ii=0; 
2bc80 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b  ii<nTabList; ii+
2bc90 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  +){.    int addr
2bca0 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74  Explain;.    int
2bcb0 20 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c   wsFlags;.    pL
2bcc0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
2bcd0 61 5b 69 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61  a[ii];.    wsFla
2bce0 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  gs = pLevel->pWL
2bcf0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69  oop->wsFlags;.#i
2bd00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bd10 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2bd20 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  X.    if( (pLeve
2bd30 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  l->pWLoop->wsFla
2bd40 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
2bd50 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
2bd60 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
2bd70 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
2bd80 65 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  e, &pWInfo->sWC,
2bd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bda0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2bdb0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f  evel->iFrom], no
2bdc0 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
2bdd0 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
2bde0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2bdf0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2be00 6f 72 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  or;.    }.#endif
2be10 0a 20 20 20 20 61 64 64 72 45 78 70 6c 61 69 6e  .    addrExplain
2be20 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
2be30 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
2be40 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
2be50 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2be60 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72   ii, pLevel->iFr
2be70 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 0a 20  om, wctrlFlags. 
2be80 20 20 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c     );.    pLevel
2be90 2d 3e 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c  ->addrBody = sql
2bea0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2beb0 64 64 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52  ddr(v);.    notR
2bec0 65 61 64 79 20 3d 20 73 71 6c 69 74 65 33 57 68  eady = sqlite3Wh
2bed0 65 72 65 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  ereCodeOneLoopSt
2bee0 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20  art(pWInfo, ii, 
2bef0 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
2bf00 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
2bf10 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
2bf20 6f 6e 74 3b 0a 20 20 20 20 69 66 28 20 28 77 73  ont;.    if( (ws
2bf30 46 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54  Flags&WHERE_MULT
2bf40 49 5f 4f 52 29 3d 3d 30 20 26 26 20 28 77 63 74  I_OR)==0 && (wct
2bf50 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
2bf60 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20 29  _SUBCLAUSE)==0 )
2bf70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
2bf80 68 65 72 65 41 64 64 53 63 61 6e 53 74 61 74 75  hereAddScanStatu
2bf90 73 28 76 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  s(v, pTabList, p
2bfa0 4c 65 76 65 6c 2c 20 61 64 64 72 45 78 70 6c 61  Level, addrExpla
2bfb0 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  in);.    }.  }..
2bfc0 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20    /* Done. */.  
2bfd0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
2bfe0 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57 48 45  t((v, "Begin WHE
2bff0 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 72 65  RE-core"));.  re
2c000 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
2c010 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
2c020 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2c030 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a  whereBeginError:
2c040 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
2c050 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
2c060 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
2c070 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2c080 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f  p;.    whereInfo
2c090 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2c0a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2c0b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
2c0c0 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
2c0d0 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
2c0e0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
2c0f0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
2c100 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
2c110 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2c120 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2c130 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
2c140 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
2c150 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2c160 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2c170 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
2c180 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2c190 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
2c1a0 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68  el *pLevel;.  Wh
2c1b0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a  ereLoop *pLoop;.
2c1c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2c1d0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
2c1e0 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
2c1f0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2c200 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
2c210 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
2c220 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
2c230 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
2c240 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
2c250 45 2d 63 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c  E-core"));.  sql
2c260 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2c270 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
2c280 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
2c290 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
2c2a0 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
2c2b0 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2c2c0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
2c2d0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
2c2e0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69  pWLoop;.    sqli
2c2f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2c300 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
2c310 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
2c320 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
2c330 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
2c340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2c350 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
2c360 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2c370 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e  el->p2, pLevel->
2c380 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p3);.      sqlit
2c390 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2c3a0 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
2c3b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2c3c0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
2c3d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
2c3e0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78  evel->op==OP_Nex
2c3f0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
2c400 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
2c410 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29  el->op==OP_Prev)
2c420 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2c430 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2c440 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b  ->op==OP_VNext);
2c450 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2c460 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c470 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
2c480 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
2c490 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
2c4a0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
2c4b0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2c4c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2c4d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2c4e0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
2c4f0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
2c500 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
2c510 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
2c520 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
2c530 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
2c540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c550 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2c560 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
2c570 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2c580 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d  In->eEndLoopOp!=
2c590 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
2c5a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c5b0 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
2c5c0 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
2c5d0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
2c5e0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nTop);.         
2c5f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2c600 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2c610 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
2c620 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
2c630 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20  P_PrevIfOpen);. 
2c640 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
2c650 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
2c660 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e  eEndLoopOp==OP_N
2c670 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20  extIfOpen);.    
2c680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2c690 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2c6a0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
2c6b0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
2c6c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2c6d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2c6e0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2c6f0 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
2c700 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
2c710 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c720 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
2c730 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
2c740 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c750 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d  ((v, "next skip-
2c760 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f  scan on %s", pLo
2c770 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2c780 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
2c790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2c7a0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
2c7b0 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
2c7c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2c7d0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
2c7e0 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20  ->addrSkip-2);. 
2c7f0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
2c800 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
2c810 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20  MATCH_BLOBS.    
2c820 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
2c830 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20  LikeRep ){.     
2c840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c850 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
2c860 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65  pZero, (int)(pLe
2c870 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
2c880 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20 20  r>>1),.         
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c8a0 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
2c8b0 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ep);.      VdbeC
2c8c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2c8d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
2c8e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2c8f0 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
2c900 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ws = pLoop->wsFl
2c910 61 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ags;.      addr 
2c920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2c930 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
2c940 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2c950 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
2c960 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
2c970 72 74 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  rt( (ws & WHERE_
2c980 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
2c990 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
2c9a0 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
2c9b0 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2c9c0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
2c9d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c9e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2c9f0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
2ca00 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
2ca10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ca20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2ca30 5f 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20 20  _INDEXED) .     
2ca40 20 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45 52    || ((ws & WHER
2ca50 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20 70  E_MULTI_OR) && p
2ca60 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
2ca70 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2ca80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ca90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2caa0 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
2cab0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
2cac0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2cad0 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
2cae0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2caf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2cb00 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
2cb10 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
2cb20 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2cb30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2cb40 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
2cb50 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2cb60 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2cb70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2cb80 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
2cb90 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
2cba0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2cbb0 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
2cbc0 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbe0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2cbf0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2cc00 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
2cc10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
2cc20 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
2cc30 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
2cc40 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2cc50 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
2cc60 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
2cc70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2cc80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
2cc90 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
2cca0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2ccb0 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
2ccc0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
2ccd0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2cce0 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
2ccf0 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
2cd00 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
2cd10 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64   k, last;.    Vd
2cd20 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49  beOp *pOp;.    I
2cd30 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
2cd40 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2cd50 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
2cd60 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2cd70 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2cd80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2cd90 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2cda0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2cdb0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
2cdc0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
2cdd0 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f  Loop;..    /* Fo
2cde0 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20  r a co-routine, 
2cdf0 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f  change all OP_Co
2ce00 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20  lumn references 
2ce10 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  to the table of.
2ce20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f      ** the co-ro
2ce30 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f  utine into OP_Co
2ce40 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e  py of result con
2ce50 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69  tained in a regi
2ce60 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f  ster..    ** OP_
2ce70 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50  Rowid becomes OP
2ce80 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Null..    */.  
2ce90 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
2cea0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2ceb0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
2cec0 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  e( pParse->db->m
2ced0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
2cee0 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f       translateCo
2cef0 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72 73  lumnToCopy(pPars
2cf00 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  e, pLevel->addrB
2cf10 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ody, pLevel->iTa
2cf20 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf40 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52    pTabItem->regR
2cf50 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  esult, 0);.     
2cf60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2cf70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2cf80 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
2cf90 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
2cfa0 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
2cfb0 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
2cfc0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
2cfd0 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
2cfe0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
2cff0 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
2d000 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
2d010 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
2d020 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
2d030 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
2d040 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
2d050 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
2d060 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
2d070 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
2d080 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
2d090 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
2d0a0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
2d0b0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
2d0c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
2d0d0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
2d0e0 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
2d0f0 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
2d100 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
2d110 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
2d120 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
2d130 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
2d140 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
2d150 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
2d160 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
2d170 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
2d180 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
2d190 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
2d1a0 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
2d1b0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
2d1c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d1d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2d1e0 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
2d1f0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
2d200 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
2d210 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2d220 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
2d230 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2d240 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
2d250 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64  _OR ){.      pId
2d260 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43  x = pLevel->u.pC
2d270 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  ovidx;.    }.   
2d280 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20 26   if( pIdx.     &
2d290 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  & (pWInfo->eOneP
2d2a0 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2d2b0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
2d2c0 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20  dx->pTable)).   
2d2d0 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63    && !db->malloc
2d2e0 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20  Failed.    ){.  
2d2f0 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
2d300 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2d310 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
2d320 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
2d330 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
2d340 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
2d350 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , k);.      for(
2d360 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
2d370 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
2d380 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
2d390 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
2d3a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2d3b0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2d3c0 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
2d3d0 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
2d3e0 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
2d3f0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
2d400 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
2d410 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2d420 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
2d430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
2d440 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
2d450 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2d460 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2d470 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
2d480 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
2d490 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
2d4a0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  >=0 );.         
2d4b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
2d4c0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
2d4d0 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
2d4e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
2d4f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2d500 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
2d510 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
2d520 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
2d530 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
2d540 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
2d550 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2d560 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2d570 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
2d580 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2d590 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  || pWInfo->eOneP
2d5a0 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ass );.        }
2d5b0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
2d5c0 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
2d5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
2d5e0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2d5f0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2d600 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2d610 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
2d620 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d630 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
2d640 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
2d650 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  .  pParse->nQuer
2d660 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
2d670 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
2d680 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
2d690 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2d6a0 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.