/ Hex Artifact Content
Login

Artifact 10ae856aa4bcf7c6be39b6b53422fc94e713ab8a19383b4cf525bc05ae70d872:


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 36 74  reLoop of the 6t
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 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
200d0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
200e0 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b 0a 20 20  .nIdxCol = 0;.  
200f0 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70    }.    iCur = p
20100 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
20110 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
20120 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a  iCursor;..    /*
20130 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52   Mark off any OR
20140 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74 68  DER BY term X th
20150 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  at is a column i
20160 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20  n the table of. 
20170 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
20180 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68  t loop for which
20190 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20 69   there is term i
201a0 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20 20  n the WHERE.    
201b0 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
201c0 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20   form X IS NULL 
201d0 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65  or X=? that refe
201e0 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72  rence only outer
201f0 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20  .    ** loops.. 
20200 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
20210 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
20220 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d  ++){.      if( M
20230 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
20240 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
20250 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71      pOBExpr = sq
20260 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
20270 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  late(pOrderBy->a
20280 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
20290 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
202a0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
202b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
202c0 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62  f( pOBExpr->iTab
202d0 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  le!=iCur ) conti
202e0 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  nue;.      pTerm
202f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
20300 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d  indTerm(&pWInfo-
20310 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45  >sWC, iCur, pOBE
20320 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20340 20 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71 4f       ~ready, eqO
20350 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20 20  pMask, 0);.     
20360 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
20370 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20380 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
20390 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20  ator==WO_IN ){. 
203a0 20 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65 72         /* IN ter
203b0 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c 69  ms are only vali
203c0 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69 6e  d for sorting in
203d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c 49   the ORDER BY LI
203e0 4d 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  MIT .        ** 
203f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61 6e  optimization, an
20400 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20 74  d then only if t
20410 68 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c 79  hey are actually
20420 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
20430 20 62 79 20 74 68 65 20 71 75 65 72 79 20 70 6c   by the query pl
20440 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  an */.        as
20450 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73  sert( wctrlFlags
20460 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
20470 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20 20  _LIMIT );.      
20480 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f    for(j=0; j<pLo
20490 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70 54  op->nLTerm && pT
204a0 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65  erm!=pLoop->aLTe
204b0 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  rm[j]; j++){}.  
204c0 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c 6f        if( j>=pLo
204d0 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f 6e  op->nLTerm ) con
204e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
204f0 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
20500 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
20510 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
20520 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
20530 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
20540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
20550 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
20560 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
20570 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
20580 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
20590 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
205a0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
205b0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
205c0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
205d0 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
205e0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
205f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
20600 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
20610 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
20620 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
20630 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
20640 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
20650 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
20660 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
20670 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20680 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
20690 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
206a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
206b0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
206c0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
206d0 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
206e0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
206f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
20700 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
20710 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
20720 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
20730 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20740 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
20750 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
20760 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
20770 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
20780 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
20790 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
207a0 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
207b0 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
207c0 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
207d0 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
207e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
207f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
20800 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
20810 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
20820 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
20830 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
20840 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
20850 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
20860 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
20870 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
20880 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20890 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
208a0 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
208b0 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208d0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
208e0 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20  dex->pTable));. 
208f0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
20900 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
20910 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
20920 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20930 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
20940 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
20950 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
20960 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
20970 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
20980 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
20990 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
209a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
209b0 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
209c0 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
209d0 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
209e0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
209f0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
20a00 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b 20    u8 bOnce = 1; 
20a10 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
20a20 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
20a30 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
20a40 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 70      assert( j>=p
20a50 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
20a60 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  q .            |
20a70 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  | (pLoop->aLTerm
20a80 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f  [j]==0)==(j<pLoo
20a90 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20 20  p->nSkip).      
20aa0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
20ab0 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
20ac0 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f  e.nEq && j>=pLoo
20ad0 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  p->nSkip ){.    
20ae0 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20        u16 eOp = 
20af0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
20b00 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20 20  ->eOperator;..  
20b10 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
20b20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61  over == and IS a
20b30 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e  nd ISNULL terms.
20b40 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20    (Also skip IN 
20b50 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20 20  terms when.     
20b60 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57 48       ** doing WH
20b70 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
20b80 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20 0a  T processing). .
20b90 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
20ba0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
20bb0 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
20bc0 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20   a column of an 
20bd0 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43  ((?,?) IN (SELEC
20be0 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20 20  T...)) .        
20bf0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
20c00 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53 45  for which the SE
20c10 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f 72  LECT returns mor
20c20 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
20c30 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  n,.          ** 
20c40 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  check that it is
20c50 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e   the only column
20c60 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c 6f   used by this lo
20c70 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  op. Otherwise,. 
20c80 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69           ** if i
20c90 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f 20  t is one of two 
20ca0 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66  or more, none of
20cb0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61 6e   the columns can
20cc0 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
20cd0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 6d   considered to m
20ce0 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42 59  atch an ORDER BY
20cf0 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 20   term.  */.     
20d00 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
20d10 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a  eqOpMask)!=0 ){.
20d20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
20d30 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
20d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20d50 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
20d60 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  erDistinct );.  
20d70 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
20d80 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
20d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
20da0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
20db0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 20  nue;  .         
20dc0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
20dd0 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 29  S(eOp & WO_IN) )
20de0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
20df0 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69 66   ALWAYS() justif
20e00 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73 20  ication: eOp is 
20e10 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  an equality oper
20e20 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65 0a  ator due to the.
20e30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6a              ** j
20e40 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
20e50 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  nEq constraint a
20e60 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61 6c  bove.  Any equal
20e70 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20 20  ity other.      
20e80 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57 4f        ** than WO
20e90 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65 64 20  _IN is captured 
20ea0 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
20eb0 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20 6f  "if".  So this o
20ec0 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ne.            *
20ed0 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f 20  * always has to 
20ee0 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20  be WO_IN. */.   
20ef0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
20f00 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
20f10 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  m[j]->pExpr;.   
20f20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a           for(i=j
20f30 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62  +1; i<pLoop->u.b
20f40 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a  tree.nEq; i++){.
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20f60 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  ( pLoop->aLTerm[
20f70 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b  i]->pExpr==pX ){
20f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20f90 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
20fa0 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65  >aLTerm[i]->eOpe
20fb0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29  rator & WO_IN) )
20fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20fd0 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20    bOnce = 0;.   
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
20ff0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
21000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
21010 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
21020 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
21030 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
21040 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
21050 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
21060 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
21070 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
21080 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
21090 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
210a0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
210b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
210c0 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
210d0 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
210e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
210f0 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
21100 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
21110 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
21120 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
21130 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
21140 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
21150 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
21160 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21170 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57  iColumn = XN_ROW
21180 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ID;.          re
21190 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  vIdx = 0;.      
211a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
211b0 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64  An unconstrained
211c0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67   column that mig
211d0 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73  ht be NULL means
211e0 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20 20   that this.     
211f0 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20     ** WhereLoop 
21200 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65  is not well-orde
21210 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  red.        */. 
21220 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64         if( isOrd
21230 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20  erDistinct.     
21240 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d      && iColumn>=
21250 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e  0.         && j>
21260 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
21270 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  nEq.         && 
21280 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
21290 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  aCol[iColumn].no
212a0 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20  tNull==0.       
212b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
212c0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
212d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
212e0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68        /* Find th
212f0 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
21300 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
21310 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c   to the j-th col
21320 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  umn.        ** o
21330 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
21340 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20  mark that ORDER 
21350 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20  BY term off .   
21360 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21370 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
21380 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f       for(i=0; bO
21390 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42  nce && i<nOrderB
213a0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
213b0 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
213c0 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
213d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
213e0 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
213f0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
21400 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
21410 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
21420 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
21430 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
21440 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20  ROUPBY );.      
21450 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63      testcase( wc
21460 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
21470 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20  _DISTINCTBY );. 
21480 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
21490 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52  trlFlags & (WHER
214a0 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f  E_GROUPBY|WHERE_
214b0 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20  DISTINCTBY))==0 
214c0 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ) bOnce = 0;.   
214d0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
214e0 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  mn>=(-1) ){.    
214f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
21500 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
21510 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
21520 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
21530 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
21540 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
21550 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21560 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
21570 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  n!=iColumn ) con
21580 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
215a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
215b0 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 42 45 78  xprCompare(pOBEx
215c0 70 72 2c 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  pr,pIndex->aColE
215d0 78 70 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  xpr->a[j].pExpr,
215e0 69 43 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20  iCur) ){.       
215f0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
21600 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21620 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
21630 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
21640 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
21650 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
21660 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
21670 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
21680 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
21690 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
216a0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
216b0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
216c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
216d0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
216e0 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
216f0 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
21700 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
21710 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
21720 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c  >u.btree.nIdxCol
21730 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20   = j+1;.        
21740 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
21750 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21770 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
21780 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
21790 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
217a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
217b0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
217c0 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
217d0 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
217e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
217f0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
21800 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
21810 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
21820 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
21830 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
21840 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
21850 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
21860 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
21870 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
21880 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
21890 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
218a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
218b0 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
218c0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
218d0 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
218e0 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
218f0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
21900 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
21910 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
21920 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21940 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
21950 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
21960 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a  mn==XN_ROWID ){.
21970 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21980 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
21990 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
219a0 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
219b0 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
219c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
219d0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
219e0 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
219f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21a00 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
21a10 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
21a20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
21a30 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
21a40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
21a50 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
21a60 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
21a70 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
21a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21a90 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
21aa0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
21ab0 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
21ac0 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
21ad0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
21ae0 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
21af0 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
21b00 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
21b10 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
21b20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
21b30 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
21b40 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
21b50 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
21b60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
21b70 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
21b80 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
21b90 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
21ba0 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
21bb0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
21bc0 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
21bd0 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
21be0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
21bf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
21c00 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
21c10 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
21c20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
21c30 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
21c40 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
21c50 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
21c60 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
21c70 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
21c80 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
21c90 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
21ca0 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f  xprUsage(&pWInfo
21cb0 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
21cc0 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
21cd0 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
21ce0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
21cf0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21d00 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
21d10 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
21d20 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
21d30 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
21d40 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
21d50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21d60 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
21d70 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
21d80 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
21d90 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
21da0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
21db0 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
21dc0 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
21dd0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
21de0 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
21df0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
21e00 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
21e10 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
21e20 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
21e30 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
21e40 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
21e50 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
21e60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21e70 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
21e80 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
21e90 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
21ea0 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
21eb0 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
21ec0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
21ed0 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
21ee0 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
21ef0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
21f00 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
21f10 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
21f20 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
21f30 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
21f40 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
21f50 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
21f60 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
21f70 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
21f80 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
21f90 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
21fa0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
21fb0 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
21fc0 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
21fd0 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
21fe0 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
21ff0 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
22000 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
22010 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
22020 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
22030 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
22040 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
22050 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
22060 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
22070 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
22080 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
22090 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
220a0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
220b0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
220c0 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
220d0 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
220e0 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
220f0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
22100 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
22110 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
22120 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
22130 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
22140 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
22150 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
22160 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
22170 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
22180 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
22190 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
221a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
221b0 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
221c0 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
221d0 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
221e0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
221f0 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
22200 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
22210 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
22220 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
22230 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
22240 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
22250 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
22260 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22270 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
22280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
22290 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
222a0 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
222b0 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
222c0 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
222d0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
222e0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
222f0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
22300 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
22310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
22320 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
22330 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
22340 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
22350 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
22360 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
22370 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
22380 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
22390 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
223a0 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
223b0 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
223c0 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
223d0 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
223e0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
223f0 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
22400 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22410 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
22420 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
22430 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20   rows, assuming 
22440 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61  that the keys ha
22450 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20  ve .** nOrderby 
22460 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74  columns and that
22470 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74   the first nSort
22480 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
22490 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64  lready in.** ord
224a0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  er..*/.static Lo
224b0 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e  gEst whereSortin
224c0 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e  gCost(.  WhereIn
224d0 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f  fo *pWInfo,.  Lo
224e0 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74  gEst nRow,.  int
224f0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74   nOrderBy,.  int
22500 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a   nSorted.){.  /*
22510 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
22520 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c  ed cost of a ful
22530 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c  l external sort,
22540 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a   where N is .  *
22550 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
22560 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a  rows to sort is:
22570 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
22580 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
22590 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20  og(N))..  ** .  
225a0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72  ** Or, if the or
225b0 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61  der-by clause ha
225c0 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e  s X terms but on
225d0 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20  ly the last Y . 
225e0 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
225f0 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
22600 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
22610 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
22620 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
22630 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
22640 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
22650 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59  N * log(N)) * (Y
22660 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  /X).  **.  ** Th
22670 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
22680 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
22690 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
226a0 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c   rScale.  ** bel
226b0 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ow.  */.  LogEst
226c0 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
226d0 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
226e0 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
226f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
22700 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d  0) );.  rScale =
22710 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
22720 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64  nOrderBy-nSorted
22730 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
22740 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73  - 66;.  rSortCos
22750 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c  t = nRow + rScal
22760 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75  e + 16;..  /* Mu
22770 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29  ltiple by log(M)
22780 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20   where M is the 
22790 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
227a0 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20   rows..  ** Use 
227b0 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20  the LIMIT for M 
227c0 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72  if it is smaller
227d0 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66   */.  if( (pWInf
227e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
227f0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
22800 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69  !=0 && pWInfo->i
22810 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20  Limit<nRow ){.  
22820 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d    nRow = pWInfo-
22830 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  >iLimit;.  }.  r
22840 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c  SortCost += estL
22850 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75  og(nRow);.  retu
22860 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a  rn rSortCost;.}.
22870 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
22880 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
22890 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
228a0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
228b0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
228c0 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
228d0 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
228e0 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
228f0 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
22900 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
22910 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
22920 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
22930 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
22940 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
22950 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
22960 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
22970 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
22980 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
22990 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
229a0 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
229b0 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
229c0 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
229d0 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
229e0 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
229f0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
22a00 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22a10 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
22a20 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
22a30 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
22a40 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
22a50 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
22a60 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
22a70 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c  eInfo *pWInfo, L
22a80 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  ogEst nRowEst){.
22a90 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22ab0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
22ac0 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
22ad0 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
22ae0 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
22af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22b00 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
22b10 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
22b20 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
22b30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
22b40 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22b50 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
22b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22b70 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
22b80 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
22b90 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
22ba0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22bb0 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
22bc0 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
22bd0 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22bf0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
22c00 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30  */.  int mxI = 0
22c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22c20 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
22c30 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65  entry to replace
22c40 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
22c50 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
22c60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
22c70 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
22c80 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ms */.  LogEst m
22c90 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
22ca0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
22cb0 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
22cc0 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
22cd0 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20  mxUnsorted = 0; 
22ce0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e     /* Maximum un
22cf0 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61  sorted cost of a
22d00 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a   set of path */.
22d10 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
22d20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
22d30 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
22d40 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
22d50 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
22d60 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
22d70 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
22d80 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
22d90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
22da0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
22db0 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
22dc0 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
22dd0 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
22de0 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
22df0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
22e00 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
22e10 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
22e20 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
22e30 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
22e40 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
22e50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
22e60 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
22e70 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
22e80 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
22e90 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
22ea0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
22eb0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
22ec0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
22ed0 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
22ee0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
22ef0 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
22f00 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
22f10 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43    LogEst *aSortC
22f20 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ost = 0;    /* S
22f30 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69  orting and parti
22f40 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73  al sorting costs
22f50 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
22f60 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
22f70 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
22f80 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
22f90 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
22fa0 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
22fb0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
22fc0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
22fd0 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f  ted at pSpace */
22fe0 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
22ff0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
23000 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23010 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
23020 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
23030 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
23040 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
23050 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
23060 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
23070 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
23080 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
23090 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
230a0 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
230b0 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
230c0 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
230d0 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
230e0 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
230f0 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p<=1) ? 1 : (nLo
23100 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
23110 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
23120 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
23130 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
23140 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
23150 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
23160 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25  ver.  (nRowEst=%
23170 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  d)\n", nRowEst))
23180 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45  ;..  /* If nRowE
23190 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  st is zero and t
231a0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
231b0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f   BY clause, igno
231c0 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20  re it. In this. 
231d0 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72   ** case the pur
231e0 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
231f0 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65  l is to estimate
23200 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
23210 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  ows returned.  *
23220 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c  * by the overall
23230 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69   query. Once thi
23240 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62  s estimate has b
23250 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
23260 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69  e caller.  ** wi
23270 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
23280 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  unction a second
23290 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74   time, passing t
232a0 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74  he estimate as t
232b0 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20  he.  ** nRowEst 
232c0 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
232d0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
232e0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
232f0 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  Est==0 ){.    nO
23300 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
23310 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  lse{.    nOrderB
23320 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
23330 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
23340 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
23350 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
23360 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46  pace for aTo, aF
23370 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73  rom and aSortCos
23380 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20  t[] */.  nSpace 
23390 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
233a0 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
233b0 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
233c0 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70  xChoice*2;.  nSp
233d0 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  ace += sizeof(Lo
233e0 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
233f0 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
23400 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
23410 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  N(db, nSpace);. 
23420 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
23430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23440 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f  OMEM_BKPT;.  aTo
23450 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
23460 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
23470 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
23480 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
23490 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
234a0 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
234b0 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
234c0 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
234d0 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
234e0 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
234f0 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
23500 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
23510 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
23520 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
23530 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
23540 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
23550 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23560 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
23570 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
23580 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
23590 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
235a0 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
235b0 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
235c0 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
235d0 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
235e0 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
235f0 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
23600 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
23610 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
23620 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
23630 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
23640 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
23650 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
23660 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
23670 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
23680 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
23690 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
236a0 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
236b0 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
236c0 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
236d0 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
236e0 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
236f0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
23700 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
23710 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
23720 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
23730 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
23740 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
23750 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
23760 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
23770 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
23780 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
23790 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
237a0 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
237b0 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
237c0 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
237d0 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
237e0 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
237f0 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
23800 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
23810 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20  s go above 28.  
23820 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
23830 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
23840 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
23850 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
23860 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
23870 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 28.  ** rows,
23880 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
23890 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
238a0 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
238b0 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
238c0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
238d0 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28  p, 48);  assert(
238e0 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   48==sqlite3LogE
238f0 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f  st(28) );.  nFro
23900 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
23910 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
23920 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
23930 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
23940 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
23950 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
23960 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
23970 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
23980 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
23990 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
239a0 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
239b0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
239c0 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
239d0 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
239e0 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
239f0 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
23a00 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
23a10 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
23a20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
23a30 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
23a40 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
23a50 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
23a60 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
23a70 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
23a80 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
23a90 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
23aa0 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
23ab0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
23ac0 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
23ad0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
23ae0 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
23af0 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
23b00 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
23b10 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
23b20 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
23b30 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
23b40 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
23b50 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
23b60 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
23b70 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
23b80 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
23b90 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
23ba0 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
23bb0 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
23bc0 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
23bd0 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
23be0 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
23bf0 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
23c00 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
23c10 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
23c20 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
23c30 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
23c40 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
23c50 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
23c60 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
23c70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
23c80 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
23c90 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23cb0 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
23cc0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
23cd0 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
23ce0 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
23d00 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
23d10 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
23d20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
23d30 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
23d40 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
23d50 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
23d60 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
23d70 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
23d80 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
23d90 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
23da0 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
23db0 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
23dc0 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
23dd0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
23de0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
23df0 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
23e00 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
23e10 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
23e20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23e30 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
23e40 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
23e50 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
23e60 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
23e70 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
23e80 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
23e90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
23ea0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
23eb0 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
23ec0 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
23ed0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
23ee0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46  if( (pWLoop->wsF
23ef0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
23f00 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
23f10 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b  From->nRow<10 ){
23f20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
23f30 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f   not use an auto
23f40 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74  matic index if t
23f50 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  he this loop is 
23f60 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20  expected.       
23f70 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73     ** to run les
23f80 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e 20  s than 2 times. 
23f90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
23fa0 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
23fb0 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
23fc0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
23fd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23fe0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
23ff0 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
24000 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
24010 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
24020 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
24030 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
24040 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
24050 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  d = sqlite3LogEs
24060 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65  tAdd(pWLoop->rSe
24070 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  tup,pWLoop->rRun
24080 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b   + pFrom->nRow);
24090 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
240a0 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
240b0 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
240c0 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65   pFrom->rUnsorte
240d0 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  d);.        nOut
240e0 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
240f0 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
24100 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
24110 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
24120 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
24130 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
24140 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a   isOrdered<0 ){.
24150 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
24160 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53  red = wherePathS
24170 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
24180 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
241a0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
241b0 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
241c0 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
241f0 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  , &revMask);.   
24200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24210 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20        revMask = 
24220 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
24230 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24240 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e    if( isOrdered>
24250 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c  =0 && isOrdered<
24260 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
24270 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 43        if( aSortC
24280 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d  ost[isOrdered]==
24290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
242a0 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
242b0 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72  ered] = whereSor
242c0 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20  tingCost(.      
242d0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
242e0 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65  , nRowEst, nOrde
242f0 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20  rBy, isOrdered. 
24300 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
24310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24320 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
24330 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e  te3LogEstAdd(rUn
24340 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73  sorted, aSortCos
24350 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a  t[isOrdered]);..
24360 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
24370 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20  RACE(0x002,.    
24380 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d            ("----
24390 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20   sort cost=%-3d 
243a0 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65  (%d/%d) increase
243b0 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d  s cost %3d to %-
243c0 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3d\n",.         
243d0 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
243e0 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72  isOrdered], (nOr
243f0 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29  derBy-isOrdered)
24400 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  , nOrderBy, .   
24410 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e 73              rUns
24420 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a  orted, rCost));.
24430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24440 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
24450 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
24460 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
24470 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
24480 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20  f pWLoop should 
24490 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
244a0 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  set of.        *
244b0 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d  * mxChoice best-
244c0 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20  so-far paths..  
244d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
244e0 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66   ** First look f
244f0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  or an existing p
24500 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73  ath among best-s
24510 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20 20  o-far paths.    
24520 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65      ** that cove
24530 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  rs the same set 
24540 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
24550 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65   the same isOrde
24560 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  red.        ** s
24570 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63 75  etting as the cu
24580 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69  rrent path candi
24590 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  date..        **
245a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
245b0 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f  term "((pTo->isO
245c0 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
245d0 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65  )&0x80)==0" is e
245e0 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
245f0 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73    ** to (pTo->is
24600 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d  Ordered==(-1))==
24610 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  (isOrdered==(-1)
24620 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  )" for the range
24630 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c  .        ** of l
24640 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20  egal values for 
24650 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36  isOrdered, -1..6
24660 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  4..        */.  
24670 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
24680 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
24690 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
246a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
246b0 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
246c0 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
246d0 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  & ((pTo->isOrder
246e0 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
246f0 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  80)==0.         
24700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24710 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
24720 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
24730 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24750 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
24760 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
24770 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20   /* None of the 
24780 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f  existing best-so
24790 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63 68  -far paths match
247a0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
247b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
247c0 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20   nTo>=mxChoice. 
247d0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43            && (rC
247e0 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72  ost>mxCost || (r
247f0 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
24800 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73  rUnsorted>=mxUns
24810 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20 20  orted)).        
24820 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
24830 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
24840 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20  candidate is no 
24850 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20  better than any 
24860 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
24870 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
24880 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69  aths currently i
24890 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61  n the best-so-fa
248a0 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69  r buffer.  So di
248b0 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20 20  scard.          
248c0 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64    ** this candid
248d0 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c  ate as not viabl
248e0 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
248f0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
24900 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
24910 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24920 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
24930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24940 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24950 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
24960 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
24970 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
24980 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
24990 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
249a0 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
249b0 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20   rCost, nOut,.  
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69  isOrdered>=0 ? i
249e0 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
249f0 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
24a00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
24a10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
24a20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24a30 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
24a40 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73  each this points
24a50 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
24a60 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65  he new candidate
24a70 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20   path.          
24a80 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  ** needs to be a
24a90 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
24aa0 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  of best-so-far p
24ab0 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  aths. */.       
24ac0 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f     if( nTo<mxCho
24ad0 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ice ){.         
24ae0 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74     /* Increase t
24af0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
24b00 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f  To set by one */
24b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
24b20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  = nTo++;.       
24b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24b40 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74        /* New pat
24b50 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70  h replaces the p
24b60 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65  rior worst to ke
24b70 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d  ep count below m
24b80 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20  xChoice */.     
24b90 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b         jj = mxI;
24ba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24bb0 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54         pTo = &aT
24bc0 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48  o[jj];.#ifdef WH
24bd0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
24be0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
24bf0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
24c00 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
24c10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
24c20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24c30 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74  ("New    %s cost
24c40 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
24c50 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
24c60 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
24c70 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f  Name(pFrom, iLoo
24c80 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73  p, pWLoop), rCos
24c90 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20  t, nOut,.       
24ca0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
24cb0 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
24cc0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
24cd0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
24ce0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
24d00 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
24d10 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  e if best-so-far
24d20 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a   path pTo=aTo[jj
24d30 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20  ] covers the.   
24d40 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73         ** same s
24d50 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
24d60 68 61 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72  has the sam isOr
24d70 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61 73  dered setting as
24d80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
24d90 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68  * candidate path
24da0 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
24db0 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
24dc0 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a   should replace.
24dd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
24de0 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64 69   or if the candi
24df0 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73  date should be s
24e00 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20  kipped */.      
24e10 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
24e20 73 74 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f  st<rCost || (pTo
24e30 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26  ->rCost==rCost &
24e40 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75  & pTo->nRow<=nOu
24e50 74 29 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45  t) ){.#ifdef WHE
24e60 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
24e70 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
24e80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24e90 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
24ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24eb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24ec0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
24ed0 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20 25         "Skip   %
24ee0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
24ef0 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
24f10 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
24f20 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
24f30 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f50 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
24f60 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
24f70 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
24f80 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24f90 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
24fa0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72   cost=%-3d,%d or
24fb0 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
24fd0 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
24fe0 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
24ff0 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
25000 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
25010 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
25020 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69  ered>=0 ? pTo->i
25030 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27  sOrdered+'0' : '
25040 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ?');.           
25050 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
25060 20 20 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64        /* Discard
25070 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 70   the candidate p
25080 61 74 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72  ath from further
25090 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
250a0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  /.            te
250b0 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
250c0 73 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20  st==rCost );.   
250d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
250e0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
250f0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
25100 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
25110 43 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20  Cost+1 );.      
25120 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72      /* Control r
25130 65 61 63 68 65 73 20 68 65 72 65 20 69 66 20 74  eaches here if t
25140 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
25150 68 20 69 73 20 62 65 74 74 65 72 20 74 68 61 6e  h is better than
25160 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
25170 2a 20 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70  * pTo path.  Rep
25180 6c 61 63 65 20 70 54 6f 20 77 69 74 68 20 74 68  lace pTo with th
25190 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a  e candidate. */.
251a0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
251b0 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34  E_ENABLED /* 0x4
251c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
251d0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
251e0 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20  ace&0x4 ){.     
251f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25200 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
25210 20 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61             "Upda
25220 74 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c  te %s cost=%-3d,
25230 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
25250 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
25260 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
25270 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
25280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25290 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
252a0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
252b0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
252c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
252d0 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20 63  intf("  was %s c
252e0 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64  ost=%-3d,%3d ord
252f0 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
25300 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
25310 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f  athName(pTo, iLo
25320 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72  op+1, 0), pTo->r
25330 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c  Cost, pTo->nRow,
25340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25350 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
25360 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
25370 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
25380 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
25390 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
253a0 20 20 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69       /* pWLoop i
253b0 73 20 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64  s a winner.  Add
253c0 20 69 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f   it to the set o
253d0 66 20 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f  f best so far */
253e0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61  .        pTo->ma
253f0 73 6b 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e  skLoop = pFrom->
25400 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
25410 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
25420 20 20 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f       pTo->revLoo
25430 70 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  p = revMask;.   
25440 20 20 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d       pTo->nRow =
25450 20 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70   nOut;.        p
25460 54 6f 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  To->rCost = rCos
25470 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
25480 72 55 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73  rUnsorted = rUns
25490 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70  orted;.        p
254a0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
254b0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
254c0 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
254d0 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
254e0 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
254f0 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
25500 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
25510 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
25520 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
25530 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
25540 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
25550 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
25560 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
25570 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
25580 55 6e 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30  Unsorted = aTo[0
25590 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ].nRow;.        
255a0 20 20 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d    for(jj=1, pTo=
255b0 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68  &aTo[1]; jj<mxCh
255c0 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b  oice; jj++, pTo+
255d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
255e0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d  if( pTo->rCost>m
255f0 78 43 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20  xCost .         
25600 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f      || (pTo->rCo
25610 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54  st==mxCost && pT
25620 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55  o->rUnsorted>mxU
25630 6e 73 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20  nsorted) .      
25640 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25650 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
25660 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20  pTo->rCost;.    
25670 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
25680 72 74 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73  rted = pTo->rUns
25690 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20  orted;.         
256a0 20 20 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20       mxI = jj;. 
256b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
256c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
256d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
256e0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
256f0 41 43 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20  ACE_ENABLED  /* 
25700 3e 3d 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  >=2 */.    if( s
25710 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
25720 20 26 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20   & 0x02 ){.     
25730 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25740 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
25750 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
25760 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
25770 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
25780 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
25790 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
257a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
257b0 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
257c0 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
257d0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
257e0 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
257f0 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
25800 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
25810 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
25820 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
25830 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69  red>=0 ? (pTo->i
25840 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20  sOrdered+'0') : 
25850 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
25860 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
25870 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
25880 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25890 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
258a0 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
258b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
258c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
258d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
258e0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
258f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
25900 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
25910 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
25920 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
25930 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
25940 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
25950 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
25960 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
25970 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
25980 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
25990 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
259a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
259b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
259c0 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
259d0 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
259e0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
259f0 53 70 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75  Space);.    retu
25a00 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
25a10 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e  .  }.  .  /* Fin
25a20 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
25a30 74 20 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77  t path.  pFrom w
25a40 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
25a50 74 69 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74  ting to that pat
25a60 68 20 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61  h */.  pFrom = a
25a70 46 72 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31  From;.  for(ii=1
25a80 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b  ; ii<nFrom; ii++
25a90 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  ){.    if( pFrom
25aa0 2d 3e 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69  ->rCost>aFrom[ii
25ab0 5d 2e 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20  ].rCost ) pFrom 
25ac0 3d 20 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20  = &aFrom[ii];.  
25ad0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  }.  assert( pWIn
25ae0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f  fo->nLevel==nLoo
25af0 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  p );.  /* Load t
25b00 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
25b10 61 74 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20  ath into pWInfo 
25b20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
25b30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
25b40 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65  Loop++){.    Whe
25b50 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
25b60 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c  = pWInfo->a + iL
25b70 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  oop;.    pLevel-
25b80 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70  >pWLoop = pWLoop
25b90 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
25ba0 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76  iLoop];.    pLev
25bb0 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f  el->iFrom = pWLo
25bc0 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c  op->iTab;.    pL
25bd0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
25be0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
25bf0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
25c00 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a  m].iCursor;.  }.
25c10 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
25c20 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25c30 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
25c40 21 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  !=0.   && (pWInf
25c50 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
25c60 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
25c70 29 3d 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66  )==0.   && pWInf
25c80 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48  o->eDistinct==WH
25c90 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
25ca0 50 0a 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a  P.   && nRowEst.
25cb0 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b    ){.    Bitmask
25cc0 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e   notUsed;.    in
25cd0 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
25ce0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
25cf0 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
25d00 3e 70 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72  >pResultSet, pFr
25d10 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
25d20 20 20 20 20 20 57 48 45 52 45 5f 44 49 53 54 49       WHERE_DISTI
25d30 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  NCTBY, nLoop-1, 
25d40 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
25d50 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29  op-1], &notUsed)
25d60 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57  ;.    if( rc==pW
25d70 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
25d80 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
25d90 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25da0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
25db0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
25dc0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
25dd0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
25de0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
25df0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
25e00 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
25e10 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  {.      if( pFro
25e20 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57  m->isOrdered==pW
25e30 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
25e40 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
25e50 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25e60 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
25e70 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
25e80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
25e90 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
25ea0 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  BSat = pFrom->is
25eb0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 70  Ordered;.      p
25ec0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
25ed0 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
25ee0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
25ef0 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a  o->nOBSat<=0 ){.
25f00 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
25f10 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20  nOBSat = 0;.    
25f20 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30 20      if( nLoop>0 
25f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
25f40 20 77 73 46 6c 61 67 73 20 3d 20 70 46 72 6f 6d   wsFlags = pFrom
25f50 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
25f60 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  ->wsFlags;.     
25f70 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67       if( (wsFlag
25f80 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
25f90 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )==0 .          
25fa0 20 26 26 20 28 77 73 46 6c 61 67 73 26 28 57 48   && (wsFlags&(WH
25fb0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f  ERE_IPK|WHERE_CO
25fc0 4c 55 4d 4e 5f 49 4e 29 29 21 3d 28 57 48 45 52  LUMN_IN))!=(WHER
25fd0 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55  E_IPK|WHERE_COLU
25fe0 4d 4e 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20  MN_IN).         
25ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26000 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20  Bitmask m = 0;. 
26010 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
26020 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  c = wherePathSat
26030 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
26040 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f  Info, pWInfo->pO
26050 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 0a 20  rderBy, pFrom,. 
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26070 20 20 20 20 20 57 48 45 52 45 5f 4f 52 44 45 52       WHERE_ORDER
26080 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f 70 2d  BY_LIMIT, nLoop-
26090 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
260a0 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b 0a 20  nLoop-1], &m);. 
260b0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
260c0 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
260d0 48 45 52 45 5f 49 50 4b 20 29 3b 0a 20 20 20 20  HERE_IPK );.    
260e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
260f0 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ( wsFlags & WHER
26100 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20  E_COLUMN_IN );. 
26110 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
26120 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  c==pWInfo->pOrde
26130 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
26140 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
26150 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  fo->bOrderedInne
26160 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20  rLoop = 1;.     
26170 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
26180 3e 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20  >revMask = m;.  
26190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
261a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
261b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
261c0 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
261d0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
261e0 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29  ERE_SORTBYGROUP)
261f0 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e  .        && pWIn
26200 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e  fo->nOBSat==pWIn
26210 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
26220 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20  xpr && nLoop>0. 
26230 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d     ){.      Bitm
26240 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b  ask revMask = 0;
26250 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65  .      int nOrde
26260 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  r = wherePathSat
26270 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
26280 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f  Info, pWInfo->pO
26290 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
262a0 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f     pFrom, 0, nLo
262b0 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
262c0 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65  op[nLoop-1], &re
262d0 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20  vMask.      );. 
262e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
262f0 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29  nfo->sorted==0 )
26300 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64  ;.      if( nOrd
26310 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er==pWInfo->pOrd
26320 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
26330 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73         pWInfo->s
26340 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  orted = 1;.     
26350 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
26360 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20  sk = revMask;.  
26370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26380 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  ..  pWInfo->nRow
26390 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f  Out = pFrom->nRo
263a0 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65  w;..  /* Free te
263b0 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61  mporary memory a
263c0 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  nd return succes
263d0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62  s */.  sqlite3Db
263e0 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63  FreeNN(db, pSpac
263f0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
26400 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26410 20 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73   Most queries us
26420 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
26430 74 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20  table (they are 
26440 6e 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68  not joins) and h
26450 61 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d  ave.** simple ==
26460 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61   constraints aga
26470 69 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65  inst indexed fie
26480 6c 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lds.  This routi
26490 6e 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  ne attempts.** t
264a0 6f 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d  o plan those sim
264b0 70 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20  ple cases using 
264c0 6d 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f  much less ceremo
264d0 6e 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67  ny than the.** g
264e0 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71  eneral-purpose q
264f0 75 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e  uery planner, an
26500 64 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20  d thereby yield 
26510 66 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70  faster sqlite3_p
26520 72 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65  repare().** time
26530 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  s for the common
26540 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   case..**.** Ret
26550 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20  urn non-zero on 
26560 73 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73  success, if this
26570 20 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61   query can be ha
26580 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  ndled by this.**
26590 20 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79   no-frills query
265a0 20 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72   planner.  Retur
265b0 6e 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71  n zero if this q
265c0 75 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a  uery needs the .
265d0 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  ** general-purpo
265e0 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  se query planner
265f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26600 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68  whereShortCut(Wh
26610 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
26620 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
26630 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
26640 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26650 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
26660 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
26670 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
26680 54 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  Term;.  WhereLoo
26690 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20  p *pLoop;.  int 
266a0 69 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  iCur;.  int j;. 
266b0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
266c0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20  Index *pIdx;..  
266d0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
266e0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28  r->pWInfo;.  if(
266f0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
26700 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
26710 55 42 43 4c 41 55 53 45 20 29 20 72 65 74 75 72  UBCLAUSE ) retur
26720 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
26730 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
26740 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
26750 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
26760 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
26770 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
26780 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
26790 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
267a0 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
267b0 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
267c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
267d0 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
267e0 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
267f0 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
26800 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
26810 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
26820 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f  lags = 0;.  pLoo
26830 70 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  p->nSkip = 0;.  
26840 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57  pTerm = sqlite3W
26850 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43  hereFindTerm(pWC
26860 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
26870 4f 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  O_EQ|WO_IS, 0);.
26880 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
26890 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
268a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
268b0 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f  WO_IS );.    pLo
268c0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
268d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
268e0 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e  ERE_IPK|WHERE_ON
268f0 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  EROW;.    pLoop-
26900 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
26910 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  rm;.    pLoop->n
26920 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70  LTerm = 1;.    p
26930 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
26940 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55  q = 1;.    /* TU
26950 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
26960 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20  rowid lookup is 
26970 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d  10 */.    pLoop-
26980 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20  >rRun = 33;  /* 
26990 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
269a0 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65  t(10) */.  }else
269b0 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  {.    for(pIdx=p
269c0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
269d0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
269e0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
269f0 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73  opMask;.      as
26a00 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54  sert( pLoop->aLT
26a10 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d  ermSpace==pLoop-
26a20 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  >aLTerm );.     
26a30 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
26a40 64 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20  dex(pIdx).      
26a50 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49   || pIdx->pPartI
26a60 64 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20  dxWhere!=0 .    
26a70 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79     || pIdx->nKey
26a80 43 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c  Col>ArraySize(pL
26a90 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
26aa0 29 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69  ) .      ) conti
26ab0 6e 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73  nue;.      opMas
26ac0 6b 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f  k = pIdx->uniqNo
26ad0 74 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57  tNull ? (WO_EQ|W
26ae0 4f 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20  O_IS) : WO_EQ;. 
26af0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
26b00 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  pIdx->nKeyCol; j
26b10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65  ++){.        pTe
26b20 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
26b30 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  eFindTerm(pWC, i
26b40 43 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73  Cur, j, 0, opMas
26b50 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
26b60 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
26b70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26b80 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
26b90 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
26ba0 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  IS );.        pL
26bb0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d  oop->aLTerm[j] =
26bc0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
26bd0 20 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64        if( j!=pId
26be0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
26bf0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f  tinue;.      pLo
26c00 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
26c10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
26c20 45 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45  ERE_ONEROW|WHERE
26c30 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
26c40 69 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65  if( pIdx->isCove
26c50 72 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e  ring || (pItem->
26c60 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
26c70 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29  nsInIndex(pIdx))
26c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
26c90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
26ca0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
26cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
26cc0 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a  Loop->nLTerm = j
26cd0 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
26ce0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a  .btree.nEq = j;.
26cf0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
26d00 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
26d10 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  dx;.      /* TUN
26d20 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75  ING: Cost of a u
26d30 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b  nique index look
26d40 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20  up is 15 */.    
26d50 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
26d60 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69  39;  /* 39==sqli
26d70 74 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f  te3LogEst(15) */
26d80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26d90 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c    }.  }.  if( pL
26da0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a  oop->wsFlags ){.
26db0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20      pLoop->nOut 
26dc0 3d 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20  = (LogEst)1;.   
26dd0 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57   pWInfo->a[0].pW
26de0 4c 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  Loop = pLoop;.  
26df0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
26e00 2d 3e 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20  ->sMaskSet.n==1 
26e10 26 26 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d  && iCur==pWInfo-
26e20 3e 73 4d 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20  >sMaskSet.ix[0] 
26e30 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61  );.    pLoop->ma
26e40 73 6b 53 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73  skSelf = 1; /* s
26e50 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
26e60 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
26e70 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a  kSet, iCur); */.
26e80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
26e90 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
26ea0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
26eb0 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
26ec0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
26ed0 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42  By ) pWInfo->nOB
26ee0 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70  Sat =  pWInfo->p
26ef0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
26f00 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
26f10 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
26f20 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
26f30 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   ){.      pWInfo
26f40 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
26f50 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
26f60 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  QUE;.    }.#ifde
26f70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
26f80 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20     pLoop->cId = 
26f90 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  '0';.#endif.    
26fa0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
26fb0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
26fc0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
26fd0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
26fe0 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
26ff0 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
27000 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
27010 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
27020 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
27030 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
27040 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
27050 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
27060 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
27070 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
27080 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
27090 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
270a0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
270b0 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
270c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
270d0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
270e0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
270f0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
27100 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
27110 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
27120 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
27130 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
27140 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
27150 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
27160 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
27170 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
27180 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
27190 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
271a0 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
271b0 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
271c0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
271d0 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
271e0 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
271f0 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
27200 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
27210 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
27220 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
27230 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
27240 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
27250 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
27260 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
27270 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
27280 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
27290 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
272a0 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
272b0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
272c0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
272d0 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
272e0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
272f0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
27300 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
27310 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
27320 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
27330 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
27340 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
27350 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
27360 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
27370 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
27380 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
27390 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
273a0 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273c0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
273d0 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
273e0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27400 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
27410 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
27420 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
27430 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
27440 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
27450 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
27460 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
27470 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
27480 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
27490 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
274a0 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
274b0 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
274c0 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
274d0 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
274e0 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
274f0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
27500 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
27510 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
27520 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
27530 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
27540 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
27550 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
27560 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
27570 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
27580 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
27590 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
275a0 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
275b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
275c0 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
275d0 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
275e0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
275f0 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
27600 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
27610 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
27620 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
27630 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
27640 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
27650 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
27660 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
27670 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
27680 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
27690 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
276a0 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
276b0 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
276c0 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
276d0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
276e0 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
276f0 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
27700 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
27710 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
27720 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
27730 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
27740 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
27750 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
27760 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
27770 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
27780 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
27790 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
277a0 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
277b0 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
277c0 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
277d0 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
277e0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
277f0 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
27800 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
27810 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
27820 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
27830 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
27840 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
27850 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
27860 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
27870 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
27880 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
27890 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
278a0 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
278b0 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
278c0 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
278d0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
278e0 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
278f0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
27900 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
27910 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
27920 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
27930 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
27940 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
27950 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
27960 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
27970 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
27980 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
27990 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
279a0 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
279b0 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
279c0 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
279d0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
279e0 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
279f0 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
27a00 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
27a10 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
27a20 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
27a30 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
27a40 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
27a50 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
27a60 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
27a70 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
27a80 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
27a90 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
27aa0 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
27ab0 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
27ac0 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
27ad0 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
27ae0 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
27af0 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
27b00 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
27b10 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
27b20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
27b30 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
27b40 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
27b50 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
27b60 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
27b70 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
27b80 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
27b90 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
27ba0 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
27bb0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
27bc0 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
27bd0 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
27be0 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
27bf0 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
27c00 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
27c10 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
27c20 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
27c30 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
27c40 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
27c50 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72  ER BY clause (or
27c60 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
27c70 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57  ause.** if the W
27c80 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61  HERE_GROUPBY fla
27c90 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72  g is set in wctr
27ca0 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c  lFlags) of a SEL
27cb0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
27cc0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
27cd0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
27ce0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
27cf0 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
27d00 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
27d10 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
27d20 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
27d30 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65  ment, then pOrde
27d40 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
27d50 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70  ** The iIdxCur p
27d60 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
27d70 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
27d80 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a   an index.  If .
27d90 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  ** WHERE_OR_SUBC
27da0 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49  LAUSE is set, iI
27db0 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72  dxCur is the cur
27dc0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  sor number of an
27dd0 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65   index.** to use
27de0 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70   for OR clause p
27df0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20  rocessing.  The 
27e00 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f  WHERE clause sho
27e10 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  uld use this.** 
27e20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e  specific cursor.
27e30 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41    If WHERE_ONEPA
27e40 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65  SS_DESIRED is se
27e50 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20  t, then iIdxCur 
27e60 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
27e70 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72  cursor in an arr
27e80 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f  ay of cursors fo
27e90 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20  r all indices.  
27ea0 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a  iIdxCur should.*
27eb0 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d  * be used to com
27ec0 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  pute the appropr
27ed0 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65  iate cursor depe
27ee0 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69  nding on which i
27ef0 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e  ndex is.** used.
27f00 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
27f10 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
27f20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27f30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
27f40 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
27f50 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
27f60 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f  pTabList,      /
27f70 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41  * FROM clause: A
27f80 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
27f90 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
27fa0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
27fb0 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ere,           /
27fc0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
27fd0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
27fe0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
27ff0 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28  /* An ORDER BY (
28000 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61  or GROUP BY) cla
28010 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
28020 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73    ExprList *pRes
28030 75 6c 74 53 65 74 2c 20 20 20 2f 2a 20 51 75 65  ultSet,   /* Que
28040 72 79 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  ry result set.  
28050 52 65 71 27 64 20 66 6f 72 20 44 49 53 54 49 4e  Req'd for DISTIN
28060 43 54 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  CT */.  u16 wctr
28070 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  lFlags,         
28080 2f 2a 20 54 68 65 20 57 48 45 52 45 5f 2a 20 66  /* The WHERE_* f
28090 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20  lags defined in 
280a0 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20  sqliteInt.h */. 
280b0 20 69 6e 74 20 69 41 75 78 41 72 67 20 20 20 20   int iAuxArg    
280c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 57           /* If W
280d0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
280e0 45 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78 20  E is set, index 
280f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20  cursor number.  
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 57 48          ** If WH
28120 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20 74  ERE_USE_LIMIT, t
28130 68 65 6e 20 74 68 65 20 6c 69 6d 69 74 20 61 6d  hen the limit am
28140 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ount */.){.  int
28150 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
28160 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
28170 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
28180 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
28190 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
281a0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
281b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
281c0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
281d0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
281e0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
281f0 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
28200 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
28210 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
28220 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
28230 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
28240 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
28250 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
28260 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
28270 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
28280 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
28290 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
282a0 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
282b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
282c0 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a  der sWLB;     /*
282d0 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 62   The WhereLoop b
282e0 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65 72  uilder */.  Wher
282f0 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
28300 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
28310 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
28320 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
28330 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
28340 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
28350 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61  vel in pWInfo->a
28360 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
28370 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  p *pLoop;       
28380 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
28390 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4c   a single WhereL
283a0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
283b0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
283c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
283d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
283e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
283f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
28400 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
28410 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28440 20 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64 65 6c   */.  u8 bFordel
28450 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
28460 20 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45   /* OPFLAG_FORDE
28470 4c 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61 73  LETE or zero, as
28480 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
28490 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
284a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
284b0 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29  NEPASS_MULTIROW)
284c0 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20 20  ==0 || (.       
284d0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
284e0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
284f0 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20 26  IRED)!=0 .     &
28500 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
28510 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
28520 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a 20  SE)==0 .  ));.. 
28530 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66 20   /* Only one of 
28540 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
28550 53 45 20 6f 72 20 57 48 45 52 45 5f 55 53 45 5f  SE or WHERE_USE_
28560 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65 72  LIMIT */.  asser
28570 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
28580 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
28590 55 53 45 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  USE)==0.        
285a0 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61      || (wctrlFla
285b0 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c  gs & WHERE_USE_L
285c0 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  IMIT)==0 );..  /
285d0 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74 69  * Variable initi
285e0 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 64  alization */.  d
285f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28600 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c 20    memset(&sWLB, 
28610 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29 29  0, sizeof(sWLB))
28620 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  ;..  /* An ORDER
28630 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65  /GROUP BY clause
28640 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36 33   of more than 63
28650 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62 65   terms cannot be
28660 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20 20   optimized */.  
28670 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65 72  testcase( pOrder
28680 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  By && pOrderBy->
28690 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b 0a  nExpr==BMS-1 );.
286a0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
286b0 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  & pOrderBy->nExp
286c0 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72 42  r>=BMS ) pOrderB
286d0 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70 4f  y = 0;.  sWLB.pO
286e0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
286f0 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  y;..  /* Disable
28700 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
28710 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
28720 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
28730 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
28740 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
28750 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
28760 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
28770 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 4f  ,...) */.  if( O
28780 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
28790 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  led(db, SQLITE_D
287a0 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a 20  istinctOpt) ){. 
287b0 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26 3d     wctrlFlags &=
287c0 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53   ~WHERE_WANT_DIS
287d0 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TINCT;.  }..  /*
287e0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
287f0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
28800 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
28810 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
28820 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
28830 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
28840 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
28850 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
28860 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
28870 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
28880 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
28890 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
288a0 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
288b0 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
288c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
288d0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
288e0 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
288f0 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
28900 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
28910 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
28920 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
28930 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 52 5f  if the WHERE_OR_
28940 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20 69  SUBCLAUSE flag i
28950 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73  s set, then we s
28960 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20  hould.  ** only 
28970 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  generate code fo
28980 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  r the first tabl
28990 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e  e in pTabList an
289a0 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20  d assume that.  
289b0 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  ** any cursors a
289c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
289d0 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73  ubsequent tables
289e0 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   are uninitializ
289f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c  ed..  */.  nTabL
28a00 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  ist = (wctrlFlag
28a10 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
28a20 43 4c 41 55 53 45 29 20 3f 20 31 20 3a 20 70 54  CLAUSE) ? 1 : pT
28a30 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20  abList->nSrc;.. 
28a40 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
28a50 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
28a60 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
28a70 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
28a80 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65  come the.  ** re
28a90 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69  turn value. A si
28aa0 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  ngle allocation 
28ab0 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
28ac0 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20   the WhereInfo. 
28ad0 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20   ** struct, the 
28ae0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72  contents of Wher
28af0 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57  eInfo.a[], the W
28b00 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
28b10 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ture.  ** and th
28b20 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
28b30 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20  tructure. Since 
28b40 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74  WhereClause cont
28b50 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20  ains an 8-byte. 
28b60 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20   ** field (type 
28b70 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74  Bitmask) it must
28b80 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61   be aligned on a
28b90 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
28ba0 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61  y on.  ** some a
28bb0 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65  rchitectures. He
28bc0 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29  nce the ROUND8()
28bd0 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e   below..  */.  n
28be0 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e  ByteWInfo = ROUN
28bf0 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49  D8(sizeof(WhereI
28c00 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31  nfo)+(nTabList-1
28c10 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
28c20 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
28c30 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
28c40 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65  cRawNN(db, nByte
28c50 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57  WInfo + sizeof(W
28c60 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66  hereLoop));.  if
28c70 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
28c80 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
28c90 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
28ca0 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  fo);.    pWInfo 
28cb0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68  = 0;.    goto wh
28cc0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
28cd0 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61   }.  pWInfo->pPa
28ce0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
28cf0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28d00 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
28d10 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
28d20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57  = pOrderBy;.  pW
28d30 49 6e 66 6f 2d 3e 70 57 68 65 72 65 20 3d 20 70  Info->pWhere = p
28d40 57 68 65 72 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Where;.  pWInfo-
28d50 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70 52  >pResultSet = pR
28d60 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49 6e  esultSet;.  pWIn
28d70 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73  fo->aiCurOnePass
28d80 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69  [0] = pWInfo->ai
28d90 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20  CurOnePass[1] = 
28da0 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c  -1;.  pWInfo->nL
28db0 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b  evel = nTabList;
28dc0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  .  pWInfo->iBrea
28dd0 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  k = pWInfo->iCon
28de0 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
28df0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
28e00 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
28e10 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
28e20 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 4c  gs;.  pWInfo->iL
28e30 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b 0a  imit = iAuxArg;.
28e40 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
28e50 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
28e60 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
28e70 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f    memset(&pWInfo
28e80 2d 3e 6e 4f 42 53 61 74 2c 20 30 2c 20 0a 20 20  ->nOBSat, 0, .  
28e90 20 20 20 20 20 20 20 6f 66 66 73 65 74 6f 66 28         offsetof(
28ea0 57 68 65 72 65 49 6e 66 6f 2c 73 57 43 29 20 2d  WhereInfo,sWC) -
28eb0 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65 49   offsetof(WhereI
28ec0 6e 66 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a 20 20  nfo,nOBSat));.  
28ed0 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e  memset(&pWInfo->
28ee0 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[0], 0, sizeof(
28ef0 57 68 65 72 65 4c 6f 6f 70 29 2b 6e 54 61 62 4c  WhereLoop)+nTabL
28f00 69 73 74 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  ist*sizeof(Where
28f10 4c 65 76 65 6c 29 29 3b 0a 20 20 61 73 73 65 72  Level));.  asser
28f20 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  t( pWInfo->eOneP
28f30 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
28f40 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20   );  /* ONEPASS 
28f50 64 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20  defaults to OFF 
28f60 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  */.  pMaskSet = 
28f70 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
28f80 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
28f90 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
28fa0 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
28fb0 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
28fc0 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
28fd0 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29  (((char*)pWInfo)
28fe0 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20  +nByteWInfo);.  
28ff0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
29000 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c  TE_ALIGNMENT(sWL
29010 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65  B.pNew) );.  whe
29020 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e  reLoopInit(sWLB.
29030 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51  pNew);.#ifdef SQ
29040 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c  LITE_DEBUG.  sWL
29050 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a  B.pNew->cId = '*
29060 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  ';.#endif..  /* 
29070 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
29080 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
29090 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
290a0 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
290b0 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
290c0 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
290d0 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
290e0 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
290f0 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
29100 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  .  sqlite3WhereC
29110 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66  lauseInit(&pWInf
29120 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b  o->sWC, pWInfo);
29130 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53  .  sqlite3WhereS
29140 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  plit(&pWInfo->sW
29150 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
29160 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70  D);.    .  /* Sp
29170 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
29180 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
29190 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
291a0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
291b0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
291c0 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
291d0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
291e0 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
291f0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
29200 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  i<sWLB.pWC->nTer
29210 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
29220 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c  ( nTabList==0 ||
29230 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
29240 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57  nstantNotJoin(sW
29250 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45  LB.pWC->a[ii].pE
29260 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
29270 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29280 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57  (pParse, sWLB.pW
29290 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  C->a[ii].pExpr, 
292a0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a  pWInfo->iBreak,.
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
292d0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
292e0 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69     sWLB.pWC->a[i
292f0 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  i].wtFlags |= TE
29300 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
29310 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
29320 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
29330 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
29340 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
29350 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
29360 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
29370 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
29380 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63  Expr;.    if( wc
29390 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
293a0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
293b0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
293c0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
293d0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
293e0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
293f0 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
29400 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
29410 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
29420 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
29430 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
29440 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68   N-th term of th
29450 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
29460 20 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d   assigned a bitm
29470 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a  ask of 1<<N..  *
29480 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20  *.  ** The rule 
29490 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
294a0 73 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73  sentence ensures
294b0 20 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68   thta if X is th
294c0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20  e bitmask for.  
294d0 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74 68  ** a table T, th
294e0 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62 69  en X-1 is the bi
294f0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74  tmask for all ot
29500 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68  her tables to th
29510 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a  e left of T..  *
29520 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69  * Knowing the bi
29530 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
29540 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
29550 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
29560 69 73 0a 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e  is.  ** importan
29570 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
29580 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
29590 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
295a0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
295b0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
295c0 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
295d0 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
295e0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
295f0 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
29600 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
29610 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
29620 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
29630 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
29640 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
29650 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
29660 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61  OR_SUBCLAUSE fla
29670 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
29680 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
29690 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
296a0 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
296b0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
296c0 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
296d0 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
296e0 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41  te3WhereTabFuncA
296f0 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61  rgs(pParse, &pTa
29700 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70  bList->a[ii], &p
29710 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d  WInfo->sWC);.  }
29720 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
29730 45 42 55 47 0a 20 20 66 6f 72 28 69 69 3d 30 3b  EBUG.  for(ii=0;
29740 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
29750 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 42  rc; ii++){.    B
29760 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74  itmask m = sqlit
29770 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70  e3WhereGetMask(p
29780 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
29790 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
297a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
297b0 3d 3d 4d 41 53 4b 42 49 54 28 69 69 29 20 29 3b  ==MASKBIT(ii) );
297c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
297d0 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
297e0 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
297f0 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
29800 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a  3WhereExprAnalyz
29810 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  e(pTabList, &pWI
29820 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
29830 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29840 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
29850 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28  ginError;..  if(
29860 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
29870 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
29880 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44  T ){.    if( isD
29890 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
298a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
298b0 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  t, &pWInfo->sWC,
298c0 20 70 52 65 73 75 6c 74 53 65 74 29 20 29 7b 0a   pResultSet) ){.
298d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53        /* The DIS
298e0 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20 69 73  TINCT marking is
298f0 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 67 6e   pointless.  Ign
29900 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ore it. */.     
29910 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
29920 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
29930 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
29940 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64 65 72  }else if( pOrder
29950 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  By==0 ){.      /
29960 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52 20 42  * Try to ORDER B
29970 59 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  Y the result set
29980 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69 6e 63   to make distinc
29990 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 73  t processing eas
299a0 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  ier */.      pWI
299b0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
299c0 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  |= WHERE_DISTINC
299d0 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  TBY;.      pWInf
299e0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 52  o->pOrderBy = pR
299f0 65 73 75 6c 74 53 65 74 3b 0a 20 20 20 20 7d 0a  esultSet;.    }.
29a00 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72    }..  /* Constr
29a10 75 63 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  uct the WhereLoo
29a20 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66  p objects */.#if
29a30 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
29a40 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69  ACE_ENABLED).  i
29a50 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
29a60 72 61 63 65 20 26 20 30 78 66 66 66 66 20 29 7b  race & 0xffff ){
29a70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
29a80 67 50 72 69 6e 74 66 28 22 2a 2a 2a 20 4f 70 74  gPrintf("*** Opt
29a90 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
29aa0 20 28 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78   (wctrlFlags: 0x
29ab0 25 78 22 2c 77 63 74 72 6c 46 6c 61 67 73 29 3b  %x",wctrlFlags);
29ac0 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c  .    if( wctrlFl
29ad0 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
29ae0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 73  LIMIT ){.      s
29af0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29b00 66 28 22 2c 20 6c 69 6d 69 74 3a 20 25 64 22 2c  f(", limit: %d",
29b10 20 69 41 75 78 41 72 67 29 3b 0a 20 20 20 20 7d   iAuxArg);.    }
29b20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
29b30 67 50 72 69 6e 74 66 28 22 29 5c 6e 22 29 3b 0a  gPrintf(")\n");.
29b40 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
29b50 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
29b60 31 30 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61  100 ){ /* Displa
29b70 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  y all terms of t
29b80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
29b90 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
29ba0 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73  ereClausePrint(s
29bb0 57 4c 42 2e 70 57 43 29 3b 0a 20 20 7d 0a 23 65  WLB.pWC);.  }.#e
29bc0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 54 61 62  ndif..  if( nTab
29bd0 4c 69 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65  List!=1 || where
29be0 53 68 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d  ShortCut(&sWLB)=
29bf0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  =0 ){.    rc = w
29c00 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26  hereLoopAddAll(&
29c10 73 57 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72  sWLB);.    if( r
29c20 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  c ) goto whereBe
29c30 67 69 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66  ginError;.  .#if
29c40 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
29c50 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
29c60 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
29c70 20 29 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c 61   ){    /* Displa
29c80 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65  y all of the Whe
29c90 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
29ca0 2f 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f  /.      WhereLoo
29cb0 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  p *p;.      int 
29cc0 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  i;.      static 
29cd0 63 6f 6e 73 74 20 63 68 61 72 20 7a 4c 61 62 65  const char zLabe
29ce0 6c 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  l[] = "012345678
29cf0 39 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  9abcdefghijklmno
29d00 70 71 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20  pqrstuvwyxz".   
29d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45            "ABCDE
29d40 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
29d50 56 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f  VWYXZ";.      fo
29d60 72 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  r(p=pWInfo->pLoo
29d70 70 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d  ps, i=0; p; p=p-
29d80 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29  >pNextLoop, i++)
29d90 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64  {.        p->cId
29da0 20 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65   = zLabel[i%size
29db0 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20  of(zLabel)];.   
29dc0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
29dd0 69 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29  int(p, sWLB.pWC)
29de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29df0 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68  #endif.  .    wh
29e00 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
29e10 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  Info, 0);.    if
29e20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29e30 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
29e40 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  eginError;.    i
29e50 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
29e60 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68  rBy ){.       wh
29e70 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57  erePathSolver(pW
29e80 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52  Info, pWInfo->nR
29e90 6f 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20  owOut+1);.      
29ea0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
29eb0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
29ec0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
29ed0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
29ee0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Info->pOrderBy==
29ef0 30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  0 && (db->flags 
29f00 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
29f10 4f 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  Order)!=0 ){.   
29f20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
29f30 6b 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d  k = ALLBITS;.  }
29f40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
29f50 45 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  Err || NEVER(db-
29f60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29  >mallocFailed) )
29f70 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
29f80 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
29f90 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
29fa0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
29fb0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
29fc0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
29fd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
29fe0 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d  - Solution nRow=
29ff0 25 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  %d", pWInfo->nRo
2a000 77 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70  wOut);.    if( p
2a010 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20  WInfo->nOBSat>0 
2a020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a030 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52  DebugPrintf(" OR
2a040 44 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22  DERBY=%d,0x%llx"
2a050 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  , pWInfo->nOBSat
2a060 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73  , pWInfo->revMas
2a070 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  k);.    }.    sw
2a080 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44  itch( pWInfo->eD
2a090 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2a0a0 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
2a0b0 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
2a0c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
2a0d0 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53  bugPrintf("  DIS
2a0e0 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a  TINCT=unique");.
2a0f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
2a110 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2a120 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
2a130 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2a140 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2a150 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  CT=ordered");.  
2a160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a170 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
2a180 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2a190 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  NORDERED: {.    
2a1a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2a1b0 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2a1c0 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a  CT=unordered");.
2a1d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a1e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2a1f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2a200 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66  ntf("\n");.    f
2a210 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e  or(ii=0; ii<pWIn
2a220 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b  fo->nLevel; ii++
2a230 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
2a240 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e  opPrint(pWInfo->
2a250 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57  a[ii].pWLoop, sW
2a260 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20  LB.pWC);.    }. 
2a270 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41   }.#endif.  /* A
2a280 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74  ttempt to omit t
2a290 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a  ables from the j
2a2a0 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  oin that do not 
2a2b0 65 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c  effect the resul
2a2c0 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66  t */.  if( pWInf
2a2d0 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20  o->nLevel>=2.   
2a2e0 26 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30  && pResultSet!=0
2a2f0 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
2a300 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
2a310 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
2a320 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  in).  ){.    Bit
2a330 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73  mask tabUsed = s
2a340 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
2a350 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
2a360 74 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a  t, pResultSet);.
2a370 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
2a380 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74  derBy ){.      t
2a390 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65  abUsed |= sqlite
2a3a0 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
2a3b0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
2a3c0 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
2a3d0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70    }.    while( p
2a3e0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
2a3f0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
2a400 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e  erm *pTerm, *pEn
2a410 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d  d;.      pLoop =
2a420 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66   pWInfo->a[pWInf
2a430 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c  o->nLevel-1].pWL
2a440 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28  oop;.      if( (
2a450 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2a460 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
2a470 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  .fg.jointype & J
2a480 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
2a490 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
2a4a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2a4b0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
2a4c0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
2a4d0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2a4e0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
2a4f0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2a500 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a510 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
2a520 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
2a530 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
2a540 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
2a550 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
2a560 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
2a570 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
2a580 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
2a590 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
2a5a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2a5b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
2a5c0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
2a5d0 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
2a5e0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
2a5f0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
2a600 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
2a610 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2a620 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a630 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2a640 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
2a650 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2a660 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
2a670 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
2a680 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
2a690 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
2a6a0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
2a6b0 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
2a6c0 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
2a6d0 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
2a6e0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
2a6f0 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
2a700 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
2a710 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
2a720 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
2a730 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
2a740 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
2a750 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
2a760 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
2a770 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
2a780 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
2a790 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
2a7a0 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
2a7b0 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
2a7c0 70 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61  priate..  */.  a
2a7d0 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
2a7e0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2a7f0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
2a800 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
2a810 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
2a820 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a830 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2a840 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
2a850 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f  wsFlags = pWInfo
2a860 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
2a870 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  sFlags;.    int 
2a880 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c 61  bOnerow = (wsFla
2a890 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
2a8a0 57 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 62  W)!=0;.    if( b
2a8b0 4f 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c 20 28  Onerow.     || (
2a8c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2a8d0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
2a8e0 49 52 4f 57 29 21 3d 30 0a 20 20 20 20 20 20 20  IROW)!=0.       
2a8f0 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61      && 0==(wsFla
2a900 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2a910 41 4c 54 41 42 4c 45 29 29 0a 20 20 20 20 29 7b  ALTABLE)).    ){
2a920 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
2a930 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f  OnePass = bOnero
2a940 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47  w ? ONEPASS_SING
2a950 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  LE : ONEPASS_MUL
2a960 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  TI;.      if( Ha
2a970 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
2a980 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28  >a[0].pTab) && (
2a990 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2a9a0 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
2a9b0 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
2a9c0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2a9d0 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a  ASS_MULTIROW ){.
2a9e0 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65            bForde
2a9f0 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f  lete = OPFLAG_FO
2aa00 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  RDELETE;.       
2aa10 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66   }.        pWInf
2aa20 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
2aa30 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
2aa40 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f  gs & ~WHERE_IDX_
2aa50 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ONLY);.      }. 
2aa60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
2aa70 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
2aa80 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
2aa90 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
2aaa0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
2aab0 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
2aac0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
2aad0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
2aae0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
2aaf0 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
2ab00 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
2ab10 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
2ab20 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
2ab30 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
2ab40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2ab50 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2ab60 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
2ab70 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
2ab80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2ab90 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
2aba0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
2abb0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2abc0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
2abd0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2abe0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
2abf0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2ac00 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
2ac10 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
2ac20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
2ac30 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
2ac40 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
2ac50 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
2ac60 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
2ac70 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
2ac80 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
2ac90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2aca0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2acb0 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
2acc0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2acd0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
2ace0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2acf0 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
2ad00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2ad10 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
2ad20 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
2ad30 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
2ad40 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2ad50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ad60 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
2ad70 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
2ad80 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
2ad90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
2ada0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
2adb0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
2adc0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
2add0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
2ade0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2adf0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2ae00 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
2ae10 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2ae20 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2ae30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
2ae40 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
2ae50 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2ae60 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
2ae70 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
2ae80 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
2ae90 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
2aea0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
2aeb0 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d  ss[0] = pTabItem
2aec0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2aed0 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   };.      sqlite
2aee0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2aef0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2af00 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
2af10 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65   op);.      asse
2af20 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  rt( pTabItem->iC
2af30 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69  ursor==pLevel->i
2af40 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
2af50 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
2af60 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2af70 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
2af80 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
2af90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2afa0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2afb0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
2afc0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
2afd0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
2afe0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2aff0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2b000 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
2b010 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
2b020 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
2b030 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
2b040 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
2b050 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
2b060 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
2b070 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
2b080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b090 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
2b0a0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2b0b0 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
2b0c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b0d0 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
2b0e0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
2b0f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2b100 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
2b110 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62    if( pLoop->u.b
2b120 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
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 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62   OPFLAG_SEEKEQ|b
2b160 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20  Fordelete);.    
2b170 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2b180 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
2b190 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b1a0 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65  P5(v, bFordelete
2b1b0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
2b1c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2b1d0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2b1e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2b1f0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2b200 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2b210 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2b220 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b240 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29       (const u8*)
2b250 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  &pTabItem->colUs
2b260 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  ed, P4_INT64);.#
2b270 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2b280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
2b290 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
2b2a0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
2b2b0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
2b2c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b2d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2b2e0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2b2f0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
2b300 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
2b310 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
2b320 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b    int iIndexCur;
2b330 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2b340 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
2b350 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69 73     /* iAuxArg is
2b360 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20 74   always set if t
2b370 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  o a positive val
2b380 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73  ue if ONEPASS is
2b390 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20   possible */.   
2b3a0 20 20 20 61 73 73 65 72 74 28 20 69 41 75 78 41     assert( iAuxA
2b3b0 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f  rg!=0 || (pWInfo
2b3c0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2b3d0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2b3e0 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  IRED)==0 );.    
2b3f0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
2b400 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61  pTab) && IsPrima
2b410 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29 0a  ryKeyIndex(pIx).
2b420 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
2b430 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2b440 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a 20  _SUBCLAUSE)!=0. 
2b450 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b460 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74  /* This is one t
2b470 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74  erm of an OR-opt
2b480 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20  imization using 
2b490 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2b4a0 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  of a.        ** 
2b4b0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
2b4c0 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f  ble.  No need fo
2b4d0 72 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64  r a separate ind
2b4e0 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49  ex */.        iI
2b4f0 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
2b500 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20  ->iTabCur;.     
2b510 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20     op = 0;.     
2b520 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66   }else if( pWInf
2b530 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
2b540 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
2b550 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20      Index *pJ = 
2b560 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
2b570 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
2b580 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78  iIndexCur = iAux
2b590 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Arg;.        ass
2b5a0 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ert( wctrlFlags 
2b5b0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2b5c0 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20  DESIRED );.     
2b5d0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
2b5e0 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20  (pJ) && pJ!=pIx 
2b5f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e  ){.          iIn
2b600 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20  dexCur++;.      
2b610 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65      pJ = pJ->pNe
2b620 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
2b630 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
2b640 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
2b650 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
2b660 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65  ePass[1] = iInde
2b670 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xCur;.      }els
2b680 65 20 69 66 28 20 69 41 75 78 41 72 67 20 26 26  e if( iAuxArg &&
2b690 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2b6a0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2b6b0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)!=0 ){.       
2b6c0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
2b6d0 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f 70  xArg;.        op
2b6e0 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b   = OP_ReopenIdx;
2b6f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2b700 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
2b710 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2b720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b730 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
2b740 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
2b750 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
2b760 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
2b770 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
2b780 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
2b790 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  r>=0 );.      if
2b7a0 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( op ){.        
2b7b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b7c0 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43  3(v, op, iIndexC
2b7d0 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
2b7e0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
2b7f0 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
2b800 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  Info(pParse, pIx
2b810 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
2b820 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2b830 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
2b840 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  T)!=0.         &
2b850 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
2b860 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
2b870 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b  N_RANGE|WHERE_SK
2b880 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20  IPSCAN))==0.    
2b890 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2b8a0 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
2b8b0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
2b8c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 57  0.         && pW
2b8d0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 21  Info->eDistinct!
2b8e0 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2b8f0 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 20  ORDERED.        
2b900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2b910 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2b920 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  (v, OPFLAG_SEEKE
2b930 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43  Q); /* Hint to C
2b940 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20  OMDB2 */.       
2b950 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65 43   }.        VdbeC
2b960 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2b970 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23   pIx->zName));.#
2b980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2b990 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
2b9a0 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20  MASK.        {. 
2b9b0 20 20 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c           u64 col
2b9c0 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Used = 0;.      
2b9d0 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a      int ii, jj;.
2b9e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
2b9f0 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c  =0; ii<pIx->nCol
2ba00 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  umn; ii++){.    
2ba10 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78          jj = pIx
2ba20 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a  ->aiColumn[ii];.
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ba40 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  jj<0 ) continue;
2ba50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ba60 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33   jj>63 ) jj = 63
2ba70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2ba80 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  ( (pTabItem->col
2ba90 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a  Used & MASKBIT(j
2baa0 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j))==0 ) continu
2bab0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
2bac0 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29  olUsed |= ((u64)
2bad0 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20  1)<<(ii<63 ? ii 
2bae0 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20  : 63);.         
2baf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
2bb00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
2bb10 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73  p8(v, OP_Columns
2bb20 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c  Used, iIndexCur,
2bb30 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb50 20 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c         (u8*)&col
2bb60 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b  Used, P4_INT64);
2bb70 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2bb80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
2bb90 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
2bba0 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ASK */.      }. 
2bbb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62     }.    if( iDb
2bbc0 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64  >=0 ) sqlite3Cod
2bbd0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2bbe0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
2bbf0 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
2bc00 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2bc10 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
2bc20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2bc30 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2bc40 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a  eginError;..  /*
2bc50 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
2bc60 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
2bc70 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
2bc80 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
2bc90 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
2bca0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
2bcb0 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
2bcc0 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
2bcd0 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
2bce0 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
2bcf0 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
2bd00 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54   for(ii=0; ii<nT
2bd10 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20  abList; ii++){. 
2bd20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61     int addrExpla
2bd30 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c  in;.    int wsFl
2bd40 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ags;.    pLevel 
2bd50 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d  = &pWInfo->a[ii]
2bd60 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20  ;.    wsFlags = 
2bd70 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
2bd80 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66  wsFlags;.#ifndef
2bd90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2bda0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
2bdb0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57   if( (pLevel->pW
2bdc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2bdd0 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
2bde0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
2bdf0 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
2be00 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 70  Index(pParse, &p
2be10 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20  WInfo->sWC,.    
2be20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
2be30 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2be40 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64  >iFrom], notRead
2be50 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
2be60 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2be70 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2be80 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2be90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2bea0 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71  addrExplain = sq
2beb0 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c 61 69  lite3WhereExplai
2bec0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
2bed0 20 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69    pParse, pTabLi
2bee0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20  st, pLevel, ii, 
2bef0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77  pLevel->iFrom, w
2bf00 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b  ctrlFlags.    );
2bf10 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
2bf20 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  rBody = sqlite3V
2bf30 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2bf40 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2bf50 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f  = sqlite3WhereCo
2bf60 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
2bf70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65  WInfo, ii, notRe
2bf80 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f  ady);.    pWInfo
2bf90 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c  ->iContinue = pL
2bfa0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a  evel->addrCont;.
2bfb0 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
2bfc0 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29  &WHERE_MULTI_OR)
2bfd0 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61  ==0 && (wctrlFla
2bfe0 67 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  gs&WHERE_OR_SUBC
2bff0 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  LAUSE)==0 ){.   
2c000 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41     sqlite3WhereA
2c010 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20  ddScanStatus(v, 
2c020 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c  pTabList, pLevel
2c030 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a  , addrExplain);.
2c040 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2c050 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d  Done. */.  VdbeM
2c060 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2c070 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f   "Begin WHERE-co
2c080 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  re"));.  return 
2c090 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
2c0a0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
2c0b0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
2c0c0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
2c0d0 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
2c0e0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2c0f0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
2c100 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
2c110 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2c120 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
2c130 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2c140 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
2c150 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
2c160 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
2c170 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
2c180 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2c190 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
2c1a0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
2c1b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
2c1c0 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
2c1d0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
2c1e0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
2c1f0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
2c200 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2c210 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2c220 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
2c230 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f  Level;.  WhereLo
2c240 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63  op *pLoop;.  Src
2c250 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
2c260 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2c270 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2c280 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2c290 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
2c2a0 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
2c2b0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ode..  */.  Vdbe
2c2c0 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
2c2d0 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72  , "End WHERE-cor
2c2e0 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  e"));.  sqlite3E
2c2f0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2c300 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
2c310 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
2c320 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2c330 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70   int addr;.    p
2c340 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2c350 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70  >a[i];.    pLoop
2c360 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2c370 70 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  p;.    if( pLeve
2c380 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
2c390 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2c3a0 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45  _DISABLE_SKIPAHE
2c3b0 41 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20  AD_DISTINCT.    
2c3c0 20 20 69 6e 74 20 61 64 64 72 53 65 65 6b 20 3d    int addrSeek =
2c3d0 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   0;.      Index 
2c3e0 2a 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74  *pIdx;.      int
2c3f0 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   n;.      if( pW
2c400 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
2c410 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2c420 4f 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 26  ORDERED.       &
2c430 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
2c440 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2c450 44 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20  D)!=0.       && 
2c460 28 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  (pIdx = pLoop->u
2c470 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e  .btree.pIndex)->
2c480 68 61 73 53 74 61 74 31 0a 20 20 20 20 20 20 20  hasStat1.       
2c490 26 26 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75  && (n = pLoop->u
2c4a0 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 29 3e  .btree.nIdxCol)>
2c4b0 30 0a 20 20 20 20 20 20 20 26 26 20 70 49 64 78  0.       && pIdx
2c4c0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d  ->aiRowLogEst[n]
2c4d0 3e 3d 33 36 0a 20 20 20 20 20 20 29 7b 0a 20 20  >=36.      ){.  
2c4e0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 70        int r1 = p
2c4f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2c500 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6f 70         int j, op
2c510 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
2c520 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<n; j++){.  
2c530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c540 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2c550 43 6f 6c 75 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e  Column, pLevel->
2c560 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 31 2b 6a  iIdxCur, j, r1+j
2c570 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2c580 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2c590 6d 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20  m += n+1;.      
2c5a0 20 20 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f    op = pLevel->o
2c5b0 70 3d 3d 4f 50 5f 50 72 65 76 20 3f 20 4f 50 5f  p==OP_Prev ? OP_
2c5c0 53 65 65 6b 4c 54 20 3a 20 4f 50 5f 53 65 65 6b  SeekLT : OP_Seek
2c5d0 47 54 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  GT;.        addr
2c5e0 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  Seek = sqlite3Vd
2c5f0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
2c600 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  p, pLevel->iIdxC
2c610 75 72 2c 20 30 2c 20 72 31 2c 20 6e 29 3b 0a 20  ur, 0, r1, n);. 
2c620 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
2c630 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
2c640 53 65 65 6b 4c 54 29 3b 0a 20 20 20 20 20 20 20  SeekLT);.       
2c650 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2c660 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  v, op==OP_SeekGT
2c670 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c680 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c690 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 70 4c 65 76  OP_Goto, 1, pLev
2c6a0 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 7d  el->p2);.      }
2c6b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2c6c0 45 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48  E_DISABLE_SKIPAH
2c6d0 45 41 44 5f 44 49 53 54 49 4e 43 54 20 2a 2f 0a  EAD_DISTINCT */.
2c6e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
2c6f0 6d 6f 6e 20 63 61 73 65 3a 20 41 64 76 61 6e 63  mon case: Advanc
2c700 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  e to the next ro
2c710 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
2c720 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2c730 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2c740 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73  drCont);.      s
2c750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2c760 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
2c770 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2c780 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e  el->p2, pLevel->
2c790 70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p3);.      sqlit
2c7a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2c7b0 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
2c7c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2c7d0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
2c7e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c  CoverageIf(v, pL
2c7f0 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78  evel->op==OP_Nex
2c800 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
2c810 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76  verageIf(v, pLev
2c820 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29  el->op==OP_Prev)
2c830 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2c840 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2c850 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b  ->op==OP_VNext);
2c860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c870 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41  DISABLE_SKIPAHEA
2c880 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20  D_DISTINCT.     
2c890 20 69 66 28 20 61 64 64 72 53 65 65 6b 20 29 20   if( addrSeek ) 
2c8a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2c8b0 65 72 65 28 76 2c 20 61 64 64 72 53 65 65 6b 29  ere(v, addrSeek)
2c8c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
2c8d0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2c8e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2c8f0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2c900 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
2c910 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2c920 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
2c930 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e  ABLE && pLevel->
2c940 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20  u.in.nIn>0 ){.  
2c950 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
2c960 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
2c970 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
2c980 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2c990 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2c9a0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f  drNxt);.      fo
2c9b0 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  r(j=pLevel->u.in
2c9c0 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  .nIn, pIn=&pLeve
2c9d0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
2c9e0 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
2c9f0 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
2ca00 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2ca10 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
2ca20 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  InTop+1);.      
2ca30 20 20 69 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c    if( pIn->eEndL
2ca40 6f 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  oopOp!=OP_Noop )
2ca50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2ca60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ca70 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2ca80 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
2ca90 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
2caa0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2cab0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2cac0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2cad0 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f  f(v, pIn->eEndLo
2cae0 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f  opOp==OP_PrevIfO
2caf0 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
2cb00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2cb10 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
2cb20 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  p==OP_NextIfOpen
2cb30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2cb40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cb50 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2cb60 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
2cb70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2cb80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2cb90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2cba0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
2cbb0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64    if( pLevel->ad
2cbc0 64 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  drSkip ){.      
2cbd0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
2cbe0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53  v, pLevel->addrS
2cbf0 6b 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  kip);.      Vdbe
2cc00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78  Comment((v, "nex
2cc10 74 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25  t skip-scan on %
2cc20 73 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  s", pLoop->u.btr
2cc30 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ee.pIndex->zName
2cc40 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2cc50 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2cc60 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2cc70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
2cc80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2cc90 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2cca0 70 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  p-2);.    }.#ifn
2ccb0 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
2ccc0 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
2ccd0 42 53 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  BS.    if( pLeve
2cce0 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29  l->addrLikeRep )
2ccf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2cd00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2cd10 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69  DecrJumpZero, (i
2cd20 6e 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  nt)(pLevel->iLik
2cd30 65 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20  eRepCntr>>1),.  
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
2cd60 64 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20  drLikeRep);.    
2cd70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2cd80 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2cd90 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2cda0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
2cdb0 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
2cdc0 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
2cdd0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2cde0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2cdf0 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
2ce00 69 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65  iLeftJoin); Vdbe
2ce10 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2ce20 20 20 20 61 73 73 65 72 74 28 20 28 77 73 20 26     assert( (ws &
2ce30 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2ce40 3d 3d 30 20 7c 7c 20 28 77 73 20 26 20 57 48 45  ==0 || (ws & WHE
2ce50 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
2ce60 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  ;.      if( (ws 
2ce70 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2ce80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2ce90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2cea0 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
2ceb0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
2cec0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2ced0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
2cee0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2cef0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 77 73   .       || ((ws
2cf00 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
2cf10 52 29 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  R) && pLevel->u.
2cf20 70 43 6f 76 69 64 78 29 20 0a 20 20 20 20 20 20  pCovidx) .      
2cf30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2cf40 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2cf50 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
2cf60 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
2cf70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2cf80 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
2cf90 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
2cfa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2cfb0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2cfc0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2cfd0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
2cfe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cff0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d000 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  Goto(v, pLevel->
2d010 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2d020 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2d030 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2d040 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
2d050 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
2d060 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45  ent((v, "End WHE
2d070 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20  RE-loop%d: %s", 
2d080 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
2d090 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
2d0a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2d0b0 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  el->iFrom].pTab-
2d0c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20  >zName));.  }.. 
2d0d0 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
2d0e0 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
2d0f0 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
2d100 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
2d110 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
2d120 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2d130 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2d140 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
2d150 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  k);..  assert( p
2d160 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70  WInfo->nLevel<=p
2d170 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
2d180 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
2d190 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
2d1a0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
2d1b0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2d1c0 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b      int k, last;
2d1d0 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
2d1e0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
2d1f0 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  x = 0;.    struc
2d200 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2d210 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
2d220 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2d230 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
2d240 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
2d250 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
2d260 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
2d270 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2d280 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
2d290 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f    /* For a co-ro
2d2a0 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c  utine, change al
2d2b0 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65  l OP_Column refe
2d2c0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61  rences to the ta
2d2d0 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ble of.    ** th
2d2e0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74  e co-routine int
2d2f0 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73  o OP_Copy of res
2d300 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ult contained in
2d310 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20   a register..   
2d320 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63   ** OP_Rowid bec
2d330 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20  omes OP_Null..  
2d340 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
2d350 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
2d360 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
2d370 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
2d380 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2d390 65 64 20 29 3b 0a 20 20 20 20 20 20 74 72 61 6e  ed );.      tran
2d3a0 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70  slateColumnToCop
2d3b0 79 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  y(pParse, pLevel
2d3c0 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76  ->addrBody, pLev
2d3d0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20  el->iTabCur,.   
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65           pTabIte
2d400 6d 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29  m->regResult, 0)
2d410 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
2d420 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d430 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
2d440 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
2d450 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
2d460 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
2d470 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
2d480 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
2d490 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
2d4a0 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
2d4b0 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
2d4c0 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
2d4d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
2d4e0 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
2d4f0 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
2d500 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
2d510 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
2d520 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
2d530 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
2d540 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
2d550 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
2d560 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
2d570 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
2d580 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
2d590 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
2d5a0 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
2d5b0 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
2d5c0 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
2d5d0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
2d5e0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
2d5f0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
2d600 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
2d610 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
2d620 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
2d630 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
2d640 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
2d650 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
2d660 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
2d670 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
2d680 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2d690 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
2d6a0 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
2d6b0 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
2d6c0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
2d6d0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
2d6e0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
2d6f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2d700 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
2d710 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
2d720 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
2d730 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
2d740 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
2d750 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2d760 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52  ASS_OFF || !HasR
2d770 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
2d780 65 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d  e)).     && !db-
2d790 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
2d7a0 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20    ){.      last 
2d7b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2d7c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2d7d0 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61     k = pLevel->a
2d7e0 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70  ddrBody;.      p
2d7f0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
2d800 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20  GetOp(v, k);.   
2d810 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b     for(; k<last;
2d820 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
2d830 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
2d840 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
2d850 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2d860 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
2d870 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
2d880 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
2d890 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  nt x = pOp->p2;.
2d8a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d8b0 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d  ( pIdx->pTable==
2d8c0 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
2d8d0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
2d8e0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2d8f0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
2d900 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
2d910 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
2d920 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20              x = 
2d930 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d  pPk->aiColumn[x]
2d940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2d950 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
2d960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d970 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
2d980 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64  olumnOfIndex(pId
2d990 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  x, x);.         
2d9a0 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
2d9b0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
2d9c0 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20   = x;.          
2d9d0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
2d9e0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
2d9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da00 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
2da10 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2da20 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
2da30 7c 7c 20 78 3e 3d 30 20 0a 20 20 20 20 20 20 20  || x>=0 .       
2da40 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f         || pWInfo
2da50 2d 3e 65 4f 6e 65 50 61 73 73 20 29 3b 0a 20 20  ->eOnePass );.  
2da60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2da70 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2da80 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
2da90 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
2daa0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2dab0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
2dac0 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
2dad0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
2dae0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2daf0 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
2db00 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65  up.  */.  pParse
2db10 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2db20 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2db30 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49  ryLoop;.  whereI
2db40 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
2db50 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
2db60 0a                                               .