/ Hex Artifact Content
Login

Artifact b9f5b0ddb14c3827e70b5379e659cf4cfd524c4d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45  while( pScan->iE
1950: 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv<=pScan->nEq
1960: 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20  uiv ){.    iCur 
1970: 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70  = pScan->aiCur[p
1980: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
1990: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
19a0: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
19b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
19c0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
19d0: 3d 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63  ==XN_EXPR && pSc
19e0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20  an->pIdxExpr==0 
19f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a00: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
1a10: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
1a20: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a30: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a40: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a50: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a60: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a70: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a80: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a90: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1aa0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1ab0: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1ac0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ad0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ae0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
1af0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
1b00: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1b10: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1b20: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1b30: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1b40: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1b50: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1b60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1b70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1b80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b90: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1ba0: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
1bb0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
1bc0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
1bd0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
1be0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1bf0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
1c00: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1c10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1c20: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1c30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1c50: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1c60: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1c80: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1c90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1ca0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
1cb0: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
1cc0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1d20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1d30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1d40: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1d60: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1d70: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1d80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1d90: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1da0: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1db0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1dc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1dd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1de0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e00: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1e10: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1e20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e30: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1e40: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1e50: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1e60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e70: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1eb0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1ec0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1ed0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ee0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1ef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1f00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1f10: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1f20: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f70: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1fa0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1fb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1ff0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
2000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2010: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
2020: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2030: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2060: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
2070: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2090: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
20d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
20e0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2100: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
2110: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
2120: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
2130: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
2140: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
2150: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
2160: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
2170: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
2180: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
2190: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21c0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
21d0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
2200: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
2210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2220: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
2230: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2240: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
2250: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
2260: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
2270: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
2280: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
2290: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
22a0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
22b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
22c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
22e0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
22f0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
2300: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2310: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2320: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2330: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2340: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2360: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2370: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2380: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2390: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
23a0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
23b0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
23c0: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
23d0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
23e0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
23f0: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
2400: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
2410: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
2420: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
2430: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2440: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
2450: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2460: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2470: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2480: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2490: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
24a0: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
24b0: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
24c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24d0: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
24e0: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
24f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2500: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2510: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
2520: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
2530: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
2540: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
2550: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2560: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2570: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2580: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2590: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
25a0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
25b0: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
25c0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
25d0: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
25e0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
25f0: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2600: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2610: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
2620: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
2630: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
2640: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
2650: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2660: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2670: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2680: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
26b0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
26f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2700: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2710: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
2720: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
2730: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
2740: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
2750: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2760: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2770: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2780: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2790: 0a 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b  .){.  int j = 0;
27a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
27b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
27c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
27d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
27e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
27f0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2800: 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20  >pIdxExpr = 0;. 
2810: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2820: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
2830: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
2840: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2850: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2860: 58 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d  XN_EXPR ) pScan-
2870: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2880: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
28a0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
28b0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
28c0: 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
28d0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  D;.  }.  if( pId
28e0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
28f0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
2900: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
2910: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
2930: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2940: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2950: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
2960: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
2970: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
2980: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2990: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
29a0: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
29b0: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
29c0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
29d0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
29e0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
29f0: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
2a00: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
2a10: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
2a20: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
2a30: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2a50: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
2a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2a70: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
2a80: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2a90: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2aa0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ab0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2ac0: 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66 20  able iCur or of 
2ad0: 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69 66  index pIdx.** if
2ae0: 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70   pIdx!=0 and <op
2af0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  > is one of the 
2b00: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
2b10: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
2b20: 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72 61  y.** the op para
2b30: 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61  meter.  Return a
2b40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b50: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
2b60: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2b70: 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20 74  .** If pIdx!=0 t
2b80: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 6f  hen it must be o
2b90: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65  ne of the indexe
2ba0: 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  s of table iCur.
2bb0: 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72    .** Search for
2bc0: 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20   terms matching 
2bd0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
2be0: 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a  olumn of pIdx.**
2bf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
2c00: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
2c10: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2c30: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
2c40: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
2c50: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
2c60: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
2c70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c80: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
2c90: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
2ca0: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
2cb0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
2cc0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
2cd0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
2ce0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
2cf0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
2d00: 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75  * aiCur[]/iaColu
2d10: 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64  mn[] arrays hold
2d20: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
2d30: 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72  quivalents. Ther
2d40: 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74  e are 11.** slot
2d50: 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43  s in aiCur[]/aiC
2d60: 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20  olumn[] so that 
2d70: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f  means we can loo
2d80: 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20  k for X plus up 
2d90: 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65  to 10.** other e
2da0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
2db0: 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  .  Hence a searc
2dc0: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
2dd0: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
2de0: 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20  A1.** and A1=A2 
2df0: 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e  and A2=A3 and ..
2e00: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
2e10: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
2e20: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
2e30: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
2e40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2e50: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
2e60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
2e70: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
2e80: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
2e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
2ea0: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
2eb0: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
2ec0: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
2ed0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
2ee0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
2ef0: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
2f00: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
2f10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
2f20: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
2f30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
2f40: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
2f50: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
2f60: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
2f70: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
2f80: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
2f90: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
2fa0: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
2fb0: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
2fc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
2fd0: 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54  EQUIV..*/.WhereT
2fe0: 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72  erm *sqlite3Wher
2ff0: 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  eFindTerm(.  Whe
3000: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3010: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3020: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
3030: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3040: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3050: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3060: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3070: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3080: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3090: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
30a0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
30b0: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
30c0: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
30d0: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
30e0: 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20  .  u32 op,      
30f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
3100: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
3110: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
3120: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
3130: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3140: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3150: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3160: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3170: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3180: 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20  Term *pResult = 
3190: 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  0;.  WhereTerm *
31a0: 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  p;.  WhereScan s
31b0: 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72  can;..  p = wher
31c0: 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
31d0: 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c   pWC, iCur, iCol
31e0: 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a  umn, op, pIdx);.
31f0: 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f    op &= WO_EQ|WO
3200: 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  _IS;.  while( p 
3210: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  ){.    if( (p->p
3220: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3230: 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
3240: 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71     if( p->prereq
3250: 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e  Right==0 && (p->
3260: 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30  eOperator&op)!=0
3270: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
3280: 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74  case( p->eOperat
3290: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
32a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
32b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32c0: 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70  ( pResult==0 ) p
32d0: 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20  Result = p;.    
32e0: 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53  }.    p = whereS
32f0: 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a  canNext(&scan);.
3300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3310: 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  sult;.}../*.** T
3320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
3330: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
3340: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  an entry that ma
3350: 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
3360: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
3370: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
3380: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
3390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
33a0: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
33b0: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
33c0: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
33d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
33e0: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
33f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3400: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
3410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3440: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3450: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
3460: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3470: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
3480: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
3490: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
34a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34b0: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
34c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
34d0: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
34e0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3500: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
3510: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
3520: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3540: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
3550: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
3560: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
3570: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
3580: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
3590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
35a0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
35b0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
35c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
35d0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
35e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
35f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3600: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
3610: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
3620: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
3630: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
3640: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
3650: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
3660: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3670: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
3680: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
3690: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
36a0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
36b0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
36c0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
36d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
36e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3710: 54 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c  TRUE if the iCol
3720: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
3730: 64 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20  dex pIdx is NOT 
3740: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
3750: 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  nt indexColumnNo
3760: 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64  tNull(Index *pId
3770: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
3780: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
3790: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73   pIdx!=0 );.  as
37a0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
37b0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
37c0: 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64  umn );.  j = pId
37d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
37e0: 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b  ];.  if( j>=0 ){
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78  .    return pIdx
3800: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
3810: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c  ].notNull;.  }el
3820: 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29  se if( j==(-1) )
3830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3850: 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a  ert( j==(-2) );.
3860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
3870: 2a 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65  * Assume an inde
3880: 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63  xed expression c
3890: 61 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20  an always yield 
38a0: 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d  a NULL */..  }.}
38b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
38c0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
38d0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
38e0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
38f0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
3900: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
3910: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
3920: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
3930: 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73  dant if any subs
3940: 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  et of the column
3950: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54  s in the.** DIST
3960: 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f  INCT list are co
3970: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
3980: 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  e and individual
3990: 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  ly non-null..*/.
39a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
39b0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
39c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
39e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
39f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
3a00: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
3a10: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
3a20: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a30: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
3a40: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3a50: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
3a60: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
3a70: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
3a80: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
3a90: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
3aa0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3ab0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
3ac0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
3af0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
3b00: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
3b10: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
3b20: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
3b30: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
3b40: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
3b50: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
3b60: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
3b70: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
3b80: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
3b90: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
3ba0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
3bb0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
3bc0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
3bd0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
3be0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
3bf0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
3c00: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
3c10: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
3c20: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
3c30: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
3c40: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
3c50: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
3c60: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
3c70: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
3c80: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
3c90: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
3ca0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
3cb0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
3cc0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
3cd0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
3ce0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
3cf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3d00: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
3d10: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
3d20: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
3d30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
3d40: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3d50: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
3d60: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
3d70: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
3d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
3d90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
3da0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
3db0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
3dc0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
3dd0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
3de0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3df0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
3e00: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
3e10: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
3e20: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
3e30: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
3e40: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
3e50: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3e60: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
3e70: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
3e80: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
3e90: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
3ea0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3eb0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
3ec0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
3ed0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
3ee0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
3ef0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
3f00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
3f10: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
3f20: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
3f30: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
3f40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
3f50: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
3f60: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
3f70: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
3f80: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
3f90: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
3fa0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3fb0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
3fc0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
3fd0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
3fe0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
3ff0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
4000: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
4010: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
4020: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
4030: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4040: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
4050: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
4060: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4070: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
4080: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4090: 30 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46  0==sqlite3WhereF
40a0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
40b0: 73 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b  se, i, ~(Bitmask
40c0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
40d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
40e0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
40f0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
4100: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c  iBase, pIdx, i)<
4110: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4120: 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75     if( indexColu
4130: 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20  mnNotNull(pIdx, 
4140: 69 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i)==0 ) break;. 
4150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4160: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
4170: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
4180: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
4190: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
41a0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
41b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
41c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
41e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
41f0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
4200: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
4210: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
4220: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
4230: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
4240: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
4250: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
4260: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
4270: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
4280: 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d  Convert OP_Colum
4290: 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f  n opcodes to OP_
42a0: 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73  Copy in previous
42b0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ly generated cod
42c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
42d0: 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20  utine runs over 
42e0: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
42f0: 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74  ode and translat
4300: 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20  es OP_Column.** 
4310: 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f  opcodes into OP_
4320: 43 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61  Copy when the ta
4330: 62 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63  ble is being acc
4340: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
4350: 74 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64  tine .** instead
4360: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
4370: 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  okup..**.** If t
4380: 68 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61  he bIncrRowid pa
4390: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
43a0: 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20  en any OP_Rowid 
43b0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a  instructions on.
43c0: 2a 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75  ** cursor iTabCu
43d0: 72 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65  r are transforme
43e0: 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20  d into OP_Null. 
43f0: 4f 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69  Or, if bIncrRowi
4400: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a  d is non-zero,.*
4410: 2a 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52  * then each OP_R
4420: 6f 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72  owid is transfor
4430: 6d 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  med into an inst
4440: 72 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65  ruction to incre
4450: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ment the.** valu
4460: 65 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20  e stored in its 
4470: 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e  output register.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
44a0: 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76  oCopy(.  Vdbe *v
44b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
44c0: 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e  The VDBE contain
44d0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e  ing code to tran
44e0: 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  slate */.  int i
44f0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4500: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4520: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4530: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4540: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4550: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4560: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4570: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4580: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4590: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
45a0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
45c0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
45d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
45e0: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
45f0: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4600: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
4610: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4620: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4630: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4640: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4650: 64 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20  ddr(v);.  for(; 
4660: 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74  iStart<iEnd; iSt
4670: 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  art++, pOp++){. 
4680: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
4690: 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
46a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ue;.    if( pOp-
46b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
46c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  mn ){.      pOp-
46d0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
46e0: 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  y;.      pOp->p1
46f0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65   = pOp->p2 + iRe
4700: 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f  gister;.      pO
4710: 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b  p->p2 = pOp->p3;
4720: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  .      pOp->p3 =
4730: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
4740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
4750: 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
4760: 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20   if( bIncrRowid 
4770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
4780: 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
4790: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
47a0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P2 operand of th
47b0: 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20  e OP_Rowid. */. 
47c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
47d0: 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a  de = OP_AddImm;.
47e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
47f0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
4800: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a     pOp->p2 = 1;.
4810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4820: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4830: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
4840: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b      pOp->p1 = 0;
4850: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
4860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4870: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4880: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
4890: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
48a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
48b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
48c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
48d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
48e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
48f0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
4900: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
4910: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
4920: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
4930: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
4940: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
4950: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
4960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4970: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
4980: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
4990: 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
49a0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
49b0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
49c0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
49d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
49e0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
49f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4a00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4a10: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4a20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4a30: 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
4a40: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
4a50: 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
4a60: 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
4a70: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
4a80: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4a90: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
4aa0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4ab0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
4ac0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4ad0: 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
4ae0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4af0: 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
4b00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4b10: 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4b30: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4b40: 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
4b50: 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
4b60: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4b70: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
4b80: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
4b90: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
4ba0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
4bb0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
4bc0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
4bd0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
4be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
4bf0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
4c00: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4c10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4c20: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4c30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c40: 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
4c50: 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
4c60: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4c70: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4c80: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
4c90: 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
4ca0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4cb0: 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
4cc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
4cd0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
4ce0: 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
4cf0: 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
4d00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d10: 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
4d20: 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
4d30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4d40: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
4d50: 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
4d60: 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
4d70: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4d80: 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
4d90: 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
4da0: 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71  matedCost);.  sq
4db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4dc0: 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77  ("  estimatedRow
4dd0: 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73  s=%lld\n", p->es
4de0: 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a  timatedRows);.}.
4df0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
4e00: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
4e10: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
4e20: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
4e30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
4e50: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
4e60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4e70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4e80: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
4e90: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
4ea0: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
4eb0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
4ec0: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
4ed0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
4ee0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
4ef0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
4f00: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
4f10: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
4f20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
4f50: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
4f60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4f70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
4f80: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
4f90: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
4fa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4fb0: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
4fc0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
4fd0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
4fe0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
4ff0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
5000: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
5010: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
5020: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
5030: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
5040: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
5050: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75  O_IS))==0 ) retu
5060: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5070: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5080: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
5090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
50a0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
50b0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
50c0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
50d0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
50e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
50f0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
5100: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
5110: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
5120: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
5130: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
5140: 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
5150: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
5160: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5170: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
5180: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5190: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
51a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
51b0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
51c0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
51d0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
51e0: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
51f0: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
5200: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
5210: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
5220: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
5230: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
5240: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
5250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5260: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
5270: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
5280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
52a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
52b0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
52c0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
52d0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
52e0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
52f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5300: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
5310: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
5320: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
5330: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
5340: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
5350: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
5360: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
5370: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
5380: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
5390: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
53a0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
53b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
53c0: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
53d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
53e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
53f0: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
5400: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
5410: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
5430: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
5440: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
5450: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
5460: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
5470: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
5480: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
5490: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
54a0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
54b0: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
54c0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
54d0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54f0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
5500: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
5510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
5520: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
5530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5540: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
5550: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
5560: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
5570: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
5580: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5590: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
55a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
55b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
55c0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
55d0: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
55e0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
55f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5600: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5610: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
5620: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
5650: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5660: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5670: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5680: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5690: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
56b0: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
56c0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
56d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56f0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5700: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
5710: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
5720: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
5730: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
5740: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
5750: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
5760: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5770: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
5780: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
5790: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
57a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
57b0: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
57c0: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
57d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
57e0: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
57f0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
5800: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5810: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
5820: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
5830: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
5840: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
5850: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
5860: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
5870: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
5880: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
5890: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
58a0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
58b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
58c0: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
58d0: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73  uded rows */.  s
58e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58f0: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
5900: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
5910: 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  rm being indexed
5920: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
5930: 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  unter = 0;      
5940: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65    /* Address whe
5950: 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74  re integer count
5960: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5970: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5980: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5990: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
59a0: 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72  egisters where r
59b0: 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c  ecord is assembl
59c0: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
59d0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
59e0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
59f0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
5a00: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
5a10: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
5a20: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
5a30: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
5a40: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
5a50: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
5a60: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
5a70: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
5a80: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
5a90: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
5aa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5ab0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
5ac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5ad0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
5ae0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
5af0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
5b00: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
5b10: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
5b20: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
5b30: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
5b40: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
5b50: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
5b60: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
5b70: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
5b80: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
5b90: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5ba0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5bb0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5bc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
5bd0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
5be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
5bf0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5c00: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
5c10: 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20  n)    /* prereq 
5c20: 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20  always non-zero 
5c30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
5c40: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
5c50: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
5c60: 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20  rsor   /*   for 
5c70: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20  the right-hand  
5c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
5c90: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30  pLoop->prereq!=0
5ca0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
5cb0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62          /*   tab
5cc0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
5cd0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  N */.    if( pLo
5ce0: 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20  op->prereq==0.  
5cf0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
5d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
5d10: 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26  TUAL)==0.     &&
5d20: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5d30: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
5d40: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71  Join).     && sq
5d50: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
5d60: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20  Constant(pExpr, 
5d70: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29  pSrc->iCursor) )
5d80: 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c  {.      pPartial
5d90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
5da0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  d(pParse->db, pP
5db0: 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20  artial,.        
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5de0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5df0: 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  b, pExpr, 0));. 
5e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
5e10: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
5e20: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
5e30: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
5e40: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
5e50: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
5e60: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
5e70: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
5e80: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
5e90: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
5ea0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5eb0: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
5ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5ed0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5ee0: 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e     if( !sentWarn
5ef0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
5f00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5f10: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
5f20: 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DEX,.           
5f30: 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65   "automatic inde
5f40: 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54  x on %s(%s)", pT
5f50: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
5f60: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
5f70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
5f80: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74  e);.        sent
5f90: 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Warning = 1;.   
5fa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
5fb0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
5fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
5fd0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
5fe0: 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
5ff0: 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  Loop, nKeyCol+1)
6000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
6010: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6020: 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20  x_create;.      
6030: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
6040: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
6050: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
6060: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
6070: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
6080: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6090: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
60a0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
60b0: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
60c0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
60d0: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
60e0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
60f0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
6100: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
6110: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
6120: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
6130: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
6140: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
6150: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
6160: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6170: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
6180: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
6190: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
61a0: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
61b0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
61c0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
61d0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
61e0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
61f0: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
6200: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
6210: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
6220: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
6230: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
6240: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
6250: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
6260: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
6270: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
6280: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
6290: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
62a0: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
62b0: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
62c0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
62d0: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
62e0: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
62f0: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
6300: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
6310: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
6320: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
6330: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
6340: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28   mxBitCol = MIN(
6350: 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43  BMS-1,pTable->nC
6360: 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ol);.  testcase(
6370: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
6380: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
6390: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
63a0: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
63b0: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
63c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
63d0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
63e0: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
63f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
6400: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
6410: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
6420: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
6430: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
6440: 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  S + 1;.  }..  /*
6450: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
6460: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
6470: 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
6480: 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  ex */.  pIdx = s
6490: 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
64a0: 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65  dexObject(pParse
64b0: 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c  ->db, nKeyCol+1,
64c0: 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a   0, &zNotUsed);.
64d0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
64e0: 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e  goto end_auto_in
64f0: 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c  dex_create;.  pL
6500: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
6510: 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
6520: 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
6530: 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
6540: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
6550: 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
6560: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
6570: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
6580: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
6590: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
65a0: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
65b0: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
65c0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
65d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
65e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
65f0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
6600: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
6610: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
6620: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
6630: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6640: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
6650: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6660: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
6670: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
6680: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
6690: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
66a0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
66b0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
66c0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
66d0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
66e0: 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
66f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
6700: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
6710: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
6720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
6730: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
6740: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
6750: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6760: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
6770: 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65  ->zName : sqlite
6780: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6790: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
67a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
67b0: 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f  ert( (u32)n==pLo
67c0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
67d0: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
67e0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
67f0: 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
6800: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6810: 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
6820: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
6830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
6840: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
6850: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
6860: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a  & MASKBIT(i) ){.
6870: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6880: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
6890: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
68a0: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
68b0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
68c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
68d0: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
68e0: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
68f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
6900: 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
6910: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6920: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6930: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6940: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6950: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6960: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6970: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
6980: 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20   n==nKeyCol );. 
6990: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
69a0: 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  n] = XN_ROWID;. 
69b0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
69d0: 41 52 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ARY;..  /* Creat
69e0: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
69f0: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
6a00: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
6a10: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
6a20: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
6a30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
6a40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6a50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
6a60: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
6a70: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
6a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6a90: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
6aa0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
6ab0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
6ac0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
6ad0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
6ae0: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
6af0: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
6b00: 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tent */.  sqlite
6b10: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
6b20: 50 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74  Parse);.  pTabIt
6b30: 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66  em = &pWC->pWInf
6b40: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
6b50: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
6b60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6b70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6b80: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
6b90: 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
6ba0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64  egReturn;.    ad
6bb0: 64 72 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  drCounter = sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6bd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6be0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6bf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c00: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
6c10: 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
6c20: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
6c30: 62 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  b);.    addrTop 
6c40: 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
6c50: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
6c60: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
6c70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6c80: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
6c90: 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
6ca0: 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
6cb0: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
6cc0: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
6cd0: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
6ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6cf0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
6d00: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64  el->iTabCur); Vd
6d10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6d20: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61   }.  if( pPartia
6d30: 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e  l ){.    iContin
6d40: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
6d50: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
6d70: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61  alse(pParse, pPa
6d80: 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65  rtial, iContinue
6d90: 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
6da0: 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  ULL);.    pLoop-
6db0: 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
6dc0: 45 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20  E_PARTIALIDX;.  
6dd0: 7d 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  }.  regRecord = 
6de0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6df0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6e00: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
6e10: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a  nerateIndexKey(.
6e20: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49        pParse, pI
6e30: 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
6e40: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
6e50: 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  0, 0, 0, 0.  );.
6e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e70: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6e80: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
6e90: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
6ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
6eb0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6ec0: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
6ed0: 3b 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  ;.  if( pPartial
6ee0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
6ef0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
6f00: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
6f10: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6f20: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6f30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6f40: 67 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e  geP2(v, addrCoun
6f50: 74 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b  ter, regBase+n);
6f60: 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f  .    translateCo
6f70: 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64  lumnToCopy(v, ad
6f80: 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  drTop, pLevel->i
6f90: 54 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d  TabCur, pTabItem
6fa0: 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  ->regResult, 1);
6fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6fc0: 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
6fd0: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
6fe0: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6ff0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7010: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
7020: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
7030: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
7040: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7050: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
7060: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
7070: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
7080: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
7090: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
70a0: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
70b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
70c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
70d0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
70e0: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
70f0: 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
7100: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
7110: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
7120: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
7130: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7140: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
7150: 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
7160: 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
7170: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7180: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
7190: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
71a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
71b0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
71c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
71d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
71e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
71f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
7200: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7210: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
7220: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
7230: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
7240: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
7250: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
7260: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
7270: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
7280: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
7290: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
72a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
72b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
72c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
72d0: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
72e0: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
72f0: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
7300: 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d  use *pWC,.  Bitm
7310: 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20  ask mUnusable,  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7330: 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68  gnore terms with
7340: 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a   these prereqs *
7350: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7360: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20  st_item *pSrc,. 
7370: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7380: 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  rBy.){.  int i, 
7390: 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  j;.  int nTerm;.
73a0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
73b0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
73c0: 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
73d0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
73e0: 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64  dex_orderby *pId
73f0: 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75  xOrderBy;.  stru
7400: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7410: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
7420: 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
7430: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
7440: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
7450: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7460: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a  nfo *pIdxInfo;..
7470: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
7480: 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
7490: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
74a0: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
74b0: 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
74c0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
74d0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
74e0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
74f0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7500: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7510: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
7520: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
7530: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
7540: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
7550: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
7560: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
7570: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
7580: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
7590: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
75a0: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
75b0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
75c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
75d0: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
75e0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
75f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7600: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7610: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7620: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7630: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7640: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7650: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
7660: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
7670: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
7680: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
7690: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f  |WO_IS))==0 ) co
76a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
76b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
76c0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
76d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
76e0: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
76f0: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
7700: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
7710: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
7720: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
7730: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
7740: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
7750: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
7760: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
7770: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7780: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
7790: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
77a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
77b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
77c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
77d0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
77e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
77f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
7800: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
7820: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
7830: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
7840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7850: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
7860: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
7870: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
7880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7890: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
78a0: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
78b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
78c0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
78d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
78e0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
78f0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
7900: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7910: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
7920: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
7930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7940: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
7950: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
7960: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
7970: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
79a0: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
79b0: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
79c0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
79d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
79e0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
79f0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
7a00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7a10: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
7a20: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
7a30: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7a40: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
7a50: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
7a60: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
7a70: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
7a80: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
7a90: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
7aa0: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
7ab0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
7ac0: 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
7ad0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
7ae0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
7af0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
7b00: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
7b10: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b20: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7b30: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
7b40: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
7b50: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b60: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
7b70: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
7b80: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
7b90: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7ba0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7bb0: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
7bc0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
7bd0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
7be0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
7bf0: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
7c00: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
7c10: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
7c20: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7c30: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7c40: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
7c50: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
7c60: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
7c70: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7c80: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
7c90: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
7ca0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
7cb0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7cc0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7cd0: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
7ce0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
7cf0: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
7d40: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
7d50: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7d60: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7d70: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
7d80: 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54  8 op;.    if( pT
7d90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7da0: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7db0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7dc0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
7dd0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
7de0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
7df0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
7e00: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
7e10: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7e20: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7e30: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7e40: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7e50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7e60: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7e70: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
7e80: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7e90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ea0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
7eb0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7ec0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7ed0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
7ee0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7ef0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
7f00: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
7f10: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7f20: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7f30: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7f40: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7f50: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7f60: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7f70: 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78  (-1) );.    pIdx
7f80: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
7f90: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
7fa0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
7fb0: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
7fc0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
7fd0: 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
7fe0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
7ff0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
8000: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
8010: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d      if( op==WO_M
8020: 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 6f 70  ATCH ){.      op
8030: 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68   = pTerm->eMatch
8040: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  Op;.    }.    pI
8050: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
8060: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
8070: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
8080: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8090: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
80a0: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
80b0: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
80c0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
80d0: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
80e0: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
80f0: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
8100: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
8110: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
8120: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
8130: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
8140: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
8150: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
8160: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
8170: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
8180: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8190: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
81a0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
81b0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
81c0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
81d0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
81e0: 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
81f0: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
8200: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
8210: 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
8220: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
8230: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8240: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
8250: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8260: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
8270: 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
8280: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8290: 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
82a0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
82b0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
82c0: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
82d0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
82e0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
82f0: 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
8300: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
8310: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
8320: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
8330: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
8340: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
8350: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8360: 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
8370: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
8380: 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
8390: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
83a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
83b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
83c0: 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
83d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
83e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
83f0: 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
8400: 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
8410: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
8420: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
8430: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8440: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
8450: 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
8460: 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
8470: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8480: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8490: 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
84a0: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
84b0: 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
84c0: 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
84d0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
84e0: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
84f0: 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
8500: 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
8510: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
8520: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8530: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8540: 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
8550: 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
8560: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
8570: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
8580: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
8590: 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
85a0: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
85b0: 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
85c0: 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
85d0: 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
85e0: 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
85f0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
8600: 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
8610: 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
8620: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
8630: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
8640: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
8650: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
8660: 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
8670: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
8680: 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
8690: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
86a0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
86b0: 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
86c0: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
86d0: 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
86e0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
86f0: 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
8700: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8710: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8720: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
8730: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
8740: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
8750: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
8760: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
8770: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8780: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
8790: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
87a0: 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
87b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
87c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
87d0: 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
87e0: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
87f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8800: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
8810: 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
8820: 67 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20  g = 0;..#if 0.  
8830: 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73  /* This error is
8840: 20 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74   now caught by t
8850: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20  he caller..  ** 
8860: 53 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73  Search for "xBes
8870: 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
8880: 6f 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66  on" below */.  f
8890: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
88a0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
88b0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
88c0: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
88d0: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
88e0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
88f0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
8900: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8910: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8920: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
8930: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
8940: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
8950: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
8960: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
8970: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50  dif..  return pP
8980: 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
8990: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
89a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
89b0: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
89c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
89d0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
89e0: 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
89f0: 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
8a00: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
8a10: 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
8a20: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
8a30: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
8a40: 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
8a50: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
8a60: 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
8a70: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8a80: 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
8a90: 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Rec.**    aStat[
8aa0: 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
8ab0: 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
8ac0: 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20  l to pRec.**.** 
8ad0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
8ae0: 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74   of the sample t
8af0: 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  hat is the small
8b00: 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a  est sample that.
8b10: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
8b20: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
8b30: 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  Rec. Note that t
8b40: 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  his index is not
8b50: 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74   an index.** int
8b60: 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  o the aSample[] 
8b70: 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e  array - it is an
8b80: 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69   index into a vi
8b90: 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d  rtual set of sam
8ba0: 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ples.** based on
8bb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
8bc0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74   aSample[] and t
8bd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
8be0: 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a  lds in record .*
8bf0: 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74  * pRec. .*/.stat
8c00: 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
8c10: 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
8c20: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8c30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8c40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
8c50: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8c70: 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
8c80: 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
8c90: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
8ca0: 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56  pRec,       /* V
8cb0: 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20  ector of values 
8cc0: 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20  to consider */. 
8cd0: 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20   int roundUp,   
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8cf0: 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65  Round up if true
8d00: 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66  .  Round down if
8d10: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77   false */.  tRow
8d20: 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20  cnt *aStat      
8d30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8d40: 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65  stats written he
8d50: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
8d60: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
8d70: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
8d80: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8da0: 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69  * Index of requi
8db0: 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45  red stats in anE
8dc0: 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  q[] etc. */.  in
8dd0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8df0: 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70  ex of first samp
8e00: 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20  le >= pRec */.  
8e10: 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20  int iSample;    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8e30: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
8e40: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
8e50: 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
8e60: 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e80: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
8e90: 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
8ea0: 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
8ed0: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
8ee0: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
8ef0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
8f00: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
8f10: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
8f20: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
8f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f40: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
8f50: 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77  n pRec */.  tRow
8f60: 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20  cnt iLower = 0; 
8f70: 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b          /* anLt[
8f80: 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61  ] + anEq[] of la
8f90: 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65  rgest sample pRe
8fa0: 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64  c is > */..#ifnd
8fb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8fc0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8fd0: 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
8fe0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
8ff0: 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Rec!=0 );.  asse
9000: 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
9010: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
9020: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
9030: 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c  && pRec->nField<
9040: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  =pIdx->nSampleCo
9050: 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20  l );..  /* Do a 
9060: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
9070: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
9080: 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74  sample greater t
9090: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a  han or equal.  *
90a0: 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52  * to pRec. If pR
90b0: 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ec contains a si
90c0: 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20  ngle field, the 
90d0: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74  set of samples t
90e0: 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73  o search.  ** is
90f0: 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d   simply the aSam
9100: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ple[] array. If 
9110: 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61  the samples in a
9120: 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e  Sample[] contain
9130: 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20   more.  ** than 
9140: 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20  one fields, all 
9150: 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  fields following
9160: 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69   the first are i
9170: 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  gnored..  **.  *
9180: 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  * If pRec contai
9190: 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65  ns N fields, whe
91a0: 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61  re N is more tha
91b0: 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77  n one, then as w
91c0: 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ell as the.  ** 
91d0: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
91e0: 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20  le[] (truncated 
91f0: 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68  to N fields), th
9200: 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61  e search also ha
9210: 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  s to.  ** consid
9220: 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74  er prefixes of t
9230: 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f  hose samples. Fo
9240: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
9250: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
9260: 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65  .  ** in aSample
9270: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
9280: 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20     aSample[0] = 
9290: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
92a0: 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61   aSample[1] = (a
92b0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
92c0: 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c  aSample[2] = (b,
92d0: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53   5) .  **     aS
92e0: 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31  ample[3] = (c, 1
92f0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  00) .  **     aS
9300: 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31  ample[4] = (c, 1
9310: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  05).  **.  ** Th
9320: 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70  en the search sp
9330: 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c  ace should ideal
9340: 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65  ly be the sample
9350: 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20  s above and the 
9360: 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65  .  ** unique pre
9370: 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61  fixes [a], [b] a
9380: 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63  nd [c]. But sinc
9390: 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74  e that is hard t
93a0: 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a  o organize, .  *
93b0: 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61  * the code actua
93c0: 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69  lly searches thi
93d0: 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s set:.  **.  **
93e0: 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a       0: (a) .  *
93f0: 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20  *     1: (a, 5) 
9400: 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c  .  **     2: (a,
9410: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33   10) .  **     3
9420: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
9430: 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a      4: (b) .  **
9440: 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a       5: (b, 5) .
9450: 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20    **     6: (c) 
9460: 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c  .  **     7: (c,
9470: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9480: 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a  8: (c, 105).  **
9490: 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29       9: (c, 105)
94a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
94b0: 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ach sample in th
94c0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
94d0: 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65  y, N samples are
94e0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a   present in the.
94f0: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73    ** effective s
9500: 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20  ample array. In 
9510: 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c  the above, sampl
9520: 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62  es 0 and 1 are b
9530: 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61  ased on .  ** sa
9540: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  mple aSample[0].
9550: 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   Samples 2 and 3
9560: 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65   on aSample[1] e
9570: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  tc..  **.  ** Of
9580: 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66  ten, sample i of
9590: 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e   each block of N
95a0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
95b0: 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65  es has (i+1) fie
95c0: 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74  lds..  ** Except
95d0: 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61  , each sample ma
95e0: 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  y be extended to
95f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20   ensure that it 
9600: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
9610: 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  or.  ** equal to
9620: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61   the previous sa
9630: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61  mple in the arra
9640: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
9650: 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20  in the above, . 
9660: 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20   ** sample 2 is 
9670: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
9680: 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e   of a block of N
9690: 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20   samples, so at 
96a0: 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61  first it .  ** a
96b0: 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73  ppears that it s
96c0: 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64  hould be 1 field
96d0: 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65   in size. Howeve
96e0: 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  r, that would ma
96f0: 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c  ke it .  ** smal
9700: 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ler than sample 
9710: 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79  1, so the binary
9720: 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f   search would no
9730: 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73  t work. As a res
9740: 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73  ult, .  ** it is
9750: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f   extended to two
9760: 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70   fields. The dup
9770: 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69  licates that thi
9780: 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74  s creates do not
9790: 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79   .  ** cause any
97a0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
97b0: 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d    nField = pRec-
97c0: 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20  >nField;.  iCol 
97d0: 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d  = 0;.  iSample =
97e0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a   pIdx->nSample *
97f0: 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20   nField;.  do{. 
9800: 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20     int iSamp;   
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61   /* Index in aSa
9830: 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73  mple[] of test s
9840: 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ample */.    int
9850: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
9860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9870: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
9880: 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  n test sample */
9890: 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  ..    iTest = (i
98a0: 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a  Min+iSample)/2;.
98b0: 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73      iSamp = iTes
98c0: 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  t / nField;.    
98d0: 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20  if( iSamp>0 ){. 
98e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70       /* The prop
98f0: 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73  osed effective s
9900: 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69  ample is a prefi
9910: 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d  x of sample aSam
9920: 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20  ple[iSamp]..    
9930: 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c    ** Specificall
9940: 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20  y, the shortest 
9950: 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61  prefix of at lea
9960: 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46  st (1 + iTest%nF
9970: 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20  ield) .      ** 
9980: 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67  fields that is g
9990: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
99a0: 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69  previous effecti
99b0: 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20  ve sample.  */. 
99c0: 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73       for(n=(iTes
99d0: 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b  t % nField) + 1;
99e0: 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b   n<nField; n++){
99f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
9a00: 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e  mple[iSamp-1].an
9a10: 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65  Lt[n-1]!=aSample
9a20: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
9a30: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
9a40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9a50: 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20      n = iTest + 
9a60: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52  1;.    }..    pR
9a70: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a  ec->nField = n;.
9a80: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
9a90: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
9aa0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  re(aSample[iSamp
9ab0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61  ].n, aSample[iSa
9ac0: 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  mp].p, pRec);.  
9ad0: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
9ae0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9af0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9b00: 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65  t[n-1] + aSample
9b10: 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31  [iSamp].anEq[n-1
9b20: 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ];.      iMin = 
9b30: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
9b40: 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  se if( res==0 &&
9b50: 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20   n<nField ){.   
9b60: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
9b70: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9b80: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9b90: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9ba0: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
9bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61  }else{.      iSa
9bc0: 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20  mple = iTest;.  
9bd0: 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a      iCol = n-1;.
9be0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9bf0: 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d  res && iMin<iSam
9c00: 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61  ple );.  i = iSa
9c10: 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a  mple / nField;..
9c20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9c30: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
9c40: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
9c50: 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
9c60: 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
9c70: 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
9c80: 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
9c90: 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
9ca0: 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
9cb0: 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
9cc0: 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
9cd0: 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
9ce0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
9cf0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9d00: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iled==0 ){.    i
9d10: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
9d20: 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30     /* If (res==0
9d30: 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ) is true, then 
9d40: 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75  pRec must be equ
9d50: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20  al to sample i. 
9d60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9d70: 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
9d80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9d90: 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31  ( iCol==nField-1
9da0: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9db0: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
9dc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
9dd0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
9de0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9df0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
9e00: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20  [i].p, pRec) .  
9e10: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
9e20: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9e30: 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20  iled .      );. 
9e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e50: 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64  /* Unless i==pId
9e60: 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69  x->nSample, indi
9e70: 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63  cating that pRec
9e80: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
9e90: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d        ** all sam
9ea0: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d  ples in the aSam
9eb0: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65  ple[] array, pRe
9ec0: 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
9ed0: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
9ee0: 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65   ** (iCol+1) fie
9ef0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
9f00: 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20  ple i.  */.     
9f10: 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78   assert( i<=pIdx
9f20: 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d  ->nSample && i>=
9f30: 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  0 );.      pRec-
9f40: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31  >nField = iCol+1
9f50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9f60: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9f70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
9f80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9f90: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9fa0: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9fb0: 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
9fc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9fd0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9fe0: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  led );..      /*
9ff0: 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f   if i==0 and iCo
a000: 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72  l==0, then recor
a010: 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65  d pRec is smalle
a020: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
a030: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  es.      ** in t
a040: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
a050: 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
a060: 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20  f (iCol>0) then 
a070: 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20  pRec must.      
a080: 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ** be greater th
a090: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
a0a0: 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20  he (iCol) field 
a0b0: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
a0c0: 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   i..      ** If 
a0d0: 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63  (i>0), then pRec
a0e0: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72   must also be gr
a0f0: 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  eater than sampl
a100: 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20  e (i-1).  */.   
a110: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
a120: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a130: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20  Field = iCol;.  
a140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a150: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a160: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a170: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
a180: 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20  p, pRec)<=0.    
a190: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
a1a0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
a1b0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  iled );.      }.
a1c0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
a1d0: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a1e0: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
a1f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a200: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
a210: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
a220: 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  [i-1].n, aSample
a230: 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30  [i-1].p, pRec)<0
a240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a250: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a260: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
a280: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
a290: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
a2a0: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
a2b0: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52      /* Record pR
a2c0: 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73  ec is equal to s
a2d0: 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61  ample i */.    a
a2e0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
a2f0: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74  eld-1 );.    aSt
a300: 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
a310: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
a320: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
a330: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
a340: 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol];.  }else{.  
a350: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
a360: 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29  nt, the (iCol+1)
a370: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
a380: 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
a390: 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a  he first .    **
a3a0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
a3b0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65  greater than pRe
a3c0: 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64  c. Or, if i==pId
a3d0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20  x->nSample then 
a3e0: 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c  pRec.    ** is l
a3f0: 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  arger than all s
a400: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72  amples in the ar
a410: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ray. */.    tRow
a420: 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70  cnt iUpper, iGap
a430: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  ;.    if( i>=pId
a440: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  x->nSample ){.  
a450: 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c      iUpper = sql
a460: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
a470: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
a480: 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t[0]);.    }else
a490: 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
a4a0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
a4b0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCol];.    }.. 
a4c0: 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
a4d0: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
a4e0: 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
a4f0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
a500: 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
a510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a520: 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
a530: 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
a540: 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
a550: 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
a560: 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
a570: 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
a580: 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61  + iGap;.    aSta
a590: 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76  t[1] = pIdx->aAv
a5a0: 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a  gEq[iCol];.  }..
a5b0: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
a5c0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
a5d0: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
a5e0: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
a5f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
a600: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
a610: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a620: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
a630: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
a640: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
a650: 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
a660: 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
a670: 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
a680: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
a690: 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
a6a0: 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
a6b0: 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
a6c0: 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
a6d0: 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
a6e0: 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
a6f0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a700: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
a710: 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
a720: 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
a730: 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
a740: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
a750: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
a760: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
a770: 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
a780: 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
a790: 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
a7a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
a7b0: 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
a7c0: 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
a7d0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
a7e0: 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
a7f0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
a800: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
a810: 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
a820: 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
a830: 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
a840: 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
a850: 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
a860: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
a870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
a880: 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
a890: 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
a8a0: 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
a8b0: 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
a8c0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
a8d0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
a8e0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
a8f0: 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
a900: 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
a910: 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
a920: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
a930: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
a940: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
a950: 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
a960: 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
a970: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
a980: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
a990: 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a  eturn nRet;.}...
a9a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a9b0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a9c0: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
a9d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f   the affinity fo
a9e0: 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  r a single colum
a9f0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  n of an index..*
aa00: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71  /.static char sq
aa10: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
aa20: 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33  Affinity(sqlite3
aa30: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
aa40: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
aa50: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
aa60: 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43  && iCol<pIdx->nC
aa70: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21  olumn );.  if( !
aa80: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  pIdx->zColAff ){
aa90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
aaa0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
aab0: 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20  (db, pIdx)==0 ) 
aac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
aad0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
aae0: 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41  turn pIdx->zColA
aaf0: 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64  ff[iCol];.}.#end
ab00: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
ab10: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ab20: 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20  OR_STAT4./* .** 
ab30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ab40: 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d   called to estim
ab50: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
ab60: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  f rows visited b
ab70: 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61  y a.** range-sca
ab80: 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e  n on a skip-scan
ab90: 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d   index. For exam
aba0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ple:.**.**   CRE
abb0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
abc0: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20  t1(a, b, c);.** 
abd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
abe0: 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  t1 WHERE a=? AND
abf0: 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44   c BETWEEN ? AND
ac00: 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20   ?;.**.** Value 
ac10: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63  pLoop->nOut is c
ac20: 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
ac30: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
ac40: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a  mber of rows .**
ac50: 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61   visited for sca
ac60: 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62  nning (a=? AND b
ac70: 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69  =?). This functi
ac80: 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20  on reduces that 
ac90: 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20  estimate .** by 
aca0: 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61  some factor to a
acb0: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28  ccount for the (
acc0: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
acd0: 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61  ?) expression ba
ace0: 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  sed.** on the st
acf0: 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65  at4 data for the
ad00: 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61   index. this sca
ad10: 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d  n will be peform
ad20: 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
ad30: 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20  times (once for 
ad40: 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69  each (a,b) combi
ad50: 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63  nation that matc
ad60: 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c  hes a=?) is deal
ad70: 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68  t with .** by th
ad80: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
ad90: 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20  It does this by 
ada0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
adb0: 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c   all stat4 sampl
adc0: 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61  es, comparing va
add0: 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65  lues.** extracte
ade0: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
adf0: 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68  d pUpper with th
ae00: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
ae10: 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a  column in each.*
ae20: 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61  * sample. If L a
ae30: 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d  nd U are the num
ae40: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66  ber of samples f
ae50: 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20  ound to be less 
ae60: 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c  than or.** equal
ae70: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65   to the values e
ae80: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
ae90: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
aea0: 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e  respectively, an
aeb0: 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f  d.** N is the to
aec0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
aed0: 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70  mples, the pLoop
aee0: 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20  ->nOut value is 
aef0: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66  adjusted.** as f
af00: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
af10: 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20  nOut = nOut * ( 
af20: 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20  min(U - L, 1) / 
af30: 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f  N ).**.** If pLo
af40: 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  wer is NULL, or 
af50: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
af60: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
af70: 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a   the term, L is.
af80: 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ** set to zero. 
af90: 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c  If pUpper is NUL
afa0: 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61  L, or a value ca
afb0: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
afc0: 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20  d from it,.** U 
afd0: 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a  is set to N..**.
afe0: 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  ** Normally, thi
aff0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
b000: 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66  *pbDone to 1 bef
b010: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48  ore returning. H
b020: 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f  owever,.** if no
b030: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78   value can be ex
b040: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74  tracted from eit
b050: 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55  her pLower or pU
b060: 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65  pper (and so the
b070: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20  .** estimate of 
b080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b090: 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d  ws delivered rem
b0a0: 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c  ains unchanged),
b0b0: 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c   *pbDone.** is l
b0c0: 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a  eft as is..**.**
b0d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
b0e0: 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
b0f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
b100: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
b110: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  , .** SQLITE_OK.
b120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b130: 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61  hereRangeSkipSca
b140: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
b150: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
b160: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
b170: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
b180: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
b190: 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
b1a0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
b1b0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
b1c0: 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
b1d0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
b1e0: 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
b1f0: 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
b200: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
b210: 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
b220: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ULL */.  WhereLo
b230: 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a  op *pLoop,    /*
b240: 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75   Update the .nOu
b250: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  t value of this 
b260: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  loop */.  int *p
b270: 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f  bDone          /
b280: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
b290: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78   at least one ex
b2a0: 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63  pr. value extrac
b2b0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ted */.){.  Inde
b2c0: 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
b2d0: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
b2e0: 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
b2f0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
b300: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b310: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b320: 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69  nLower = -1;.  i
b330: 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e  nt nUpper = p->n
b340: 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20  Sample+1;.  int 
b350: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b360: 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74    u8 aff = sqlit
b370: 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66  e3IndexColumnAff
b380: 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71  inity(db, p, nEq
b390: 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  );.  CollSeq *pC
b3a0: 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  oll;.  .  sqlite
b3b0: 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b  3_value *p1 = 0;
b3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
b3d0: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
b3e0: 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71  m pLower */.  sq
b3f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20  lite3_value *p2 
b400: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
b410: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
b420: 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a   from pUpper */.
b430: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
b440: 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pVal = 0;      
b450: 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
b460: 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64  cted from record
b470: 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73   */..  pColl = s
b480: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b490: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61  Seq(pParse, p->a
b4a0: 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69  zColl[nEq]);.  i
b4b0: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
b4c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
b4d0: 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
b4e0: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e  pParse, pLower->
b4f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
b500: 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c  ff, &p1);.    nL
b510: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ower = 0;.  }.  
b520: 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63  if( pUpper && rc
b530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b550: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b560: 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72  r(pParse, pUpper
b570: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b580: 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20   aff, &p2);.    
b590: 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20  nUpper = p2 ? 0 
b5a0: 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20  : p->nSample;.  
b5b0: 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70  }..  if( p1 || p
b5c0: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
b5d0: 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20      int nDiff;. 
b5e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
b5f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
b600: 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
b610: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b620: 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64  te3Stat4Column(d
b630: 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  b, p->aSample[i]
b640: 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  .p, p->aSample[i
b650: 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29  ].n, nEq, &pVal)
b660: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
b670: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20  SQLITE_OK && p1 
b680: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b690: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b6a0: 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c  ompare(p1, pVal,
b6b0: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b6c0: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c   if( res>=0 ) nL
b6d0: 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ower++;.      }.
b6e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b6f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b  LITE_OK && p2 ){
b700: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
b710: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
b720: 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70  pare(p2, pVal, p
b730: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
b740: 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70  f( res>=0 ) nUpp
b750: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
b760: 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20    }.    nDiff = 
b770: 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72  (nUpper - nLower
b780: 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66  );.    if( nDiff
b790: 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b  <=0 ) nDiff = 1;
b7a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
b7b0: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
b7c0: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  er and lower bou
b7d0: 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e  nd specified, an
b7e0: 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  d the .    ** co
b7f0: 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61  mparisons indica
b800: 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65  te that they are
b810: 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c   close together,
b820: 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63   use the fallbac
b830: 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20  k.    ** method 
b840: 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65  (assume that the
b850: 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36   scan visits 1/6
b860: 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66  4 of the rows) f
b870: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20  or estimating.  
b880: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
b890: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e  of rows visited.
b8a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69   Otherwise, esti
b8b0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
b8c0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75  of rows.    ** u
b8d0: 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20  sing the method 
b8e0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
b8f0: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
b900: 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
b910: 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44  n. */.    if( nD
b920: 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72  iff!=1 || pUpper
b930: 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30  ==0 || pLower==0
b940: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
b950: 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33  djust = (sqlite3
b960: 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c  LogEst(p->nSampl
b970: 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45  e) - sqlite3LogE
b980: 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20  st(nDiff));.    
b990: 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d    pLoop->nOut -=
b9a0: 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20   nAdjust;.      
b9b0: 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  *pbDone = 1;.   
b9c0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
b9d0: 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70  10, ("range skip
b9e0: 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25  -scan regions: %
b9f0: 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64  u..%u  adjust=%d
ba00: 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e         nLower, n
ba30: 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d  Upper, nAdjust*-
ba40: 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29  1, pLoop->nOut))
ba50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
ba60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  {.    assert( *p
ba70: 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a  bDone==0 );.  }.
ba80: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
ba90: 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74  ree(p1);.  sqlit
baa0: 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b  e3ValueFree(p2);
bab0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
bac0: 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
bad0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
bae0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
baf0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
bb00: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  4 */../*.** This
bb10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
bb20: 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
bb30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
bb40: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
bb50: 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
bb60: 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
bb70: 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
bb80: 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
bb90: 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
bba0: 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
bbb0: 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
bbc0: 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
bbd0: 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
bbe0: 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
bbf0: 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
bc00: 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
bc10: 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
bc20: 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
bc30: 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
bc40: 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
bc50: 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
bc60: 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
bc70: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
bc80: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
bc90: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
bca0: 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
bcb0: 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
bce0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
bcf0: 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
bd00: 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
bd10: 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
bd20: 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
bd30: 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
bd40: 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
bd50: 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
bd60: 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
bd70: 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
bd80: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
bd90: 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64  value in (pBuild
bda0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
bdb0: 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75  e.nEq) is the nu
bdc0: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
bdd0: 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  x.** column subj
bde0: 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65  ect to the range
bdf0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c   constraint. Or,
be00: 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74   equivalently, t
be10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
be20: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
be30: 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62  ints optimized b
be40: 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69  y the proposed i
be50: 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65  ndex scan. For e
be60: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d  xample,.** assum
be70: 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f  ing index p is o
be80: 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20  n t1(a, b), and 
be90: 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73  the SQL query is
bea0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
beb0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
bec0: 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20  ? AND b > ? AND 
bed0: 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  b < ? ....**.** 
bee0: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
bef0: 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  to 1 (as the ran
bf00: 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
bf10: 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20  lumn, b, is the 
bf20: 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d  second .** left-
bf30: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
bf40: 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69  he index). Or, i
bf50: 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
bf60: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
bf70: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
bf80: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
bf90: 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
bfa0: 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
bfb0: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
bfc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
bfd0: 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
bfe0: 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  he sqlite3LogEst
bff0: 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  () of the.** num
c000: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
c010: 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
c020: 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76  is expected to v
c030: 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a  isit without .**
c040: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65   considering the
c050: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
c060: 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c  ts. If nEq is 0,
c070: 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20   then *pnOut is 
c080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
c090: 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * rows in the in
c0a0: 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
c0b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
c0c0: 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65  pnOut is adjuste
c0d0: 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74  d (reduced).** t
c0e0: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
c0f0: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
c100: 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  nts pLower and p
c110: 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e  Upper..** .** In
c120: 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
c130: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41  sqlite_stat4 ANA
c140: 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66  LYZE data, or if
c150: 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f   such data canno
c160: 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20  t be.** used, a 
c170: 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65  single range ine
c180: 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
c190: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
c1a0: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
c1b0: 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69  4. .** and a pai
c1c0: 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
c1d0: 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
c1e0: 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63  educes the expec
c1f0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  ted number of.**
c200: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
c210: 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e   a factor of 64.
c220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c230: 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
c240: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c250: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
c260: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
c270: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
c280: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
c290: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
c2a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
c2b0: 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
c2c0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c2d0: 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
c2e0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c2f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
c300: 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
c310: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
c320: 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
c330: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c340: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
c350: 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66  oop     /* Modif
c360: 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20  y the .nOut and 
c370: 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c  maybe .rRun fiel
c380: 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ds */.){.  int r
c390: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c3a0: 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f   int nOut = pLoo
c3b0: 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73  p->nOut;.  LogEs
c3c0: 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  t nNew;..#ifdef 
c3d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c3e0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49  AT3_OR_STAT4.  I
c3f0: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
c400: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
c410: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
c420: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
c430: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  ..  if( p->nSamp
c440: 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e  le>0 && nEq<p->n
c450: 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20  SampleCol ){.   
c460: 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64   if( nEq==pBuild
c470: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b  er->nRecValid ){
c480: 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52  .      UnpackedR
c490: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
c4a0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
c4b0: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
c4c0: 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a  ;.      u8 aff;.
c4d0: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
c4e0: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
c4f0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c500: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c510: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
c520: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
c530: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
c540: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c550: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
c560: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
c570: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
c580: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
c590: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
c5a0: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
c5b0: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
c5c0: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
c5d0: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
c5e0: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
c5f0: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
c600: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
c610: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c620: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
c630: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
c640: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
c650: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
c660: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
c670: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
c680: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
c690: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
c6a0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
c6b0: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
c6c0: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
c6d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
c6e0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c6f0: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
c700: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
c710: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
c720: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
c730: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
c740: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
c750: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c760: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
c770: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
c780: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
c790: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
c7a0: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
c7b0: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
c7c0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c7d0: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
c7e0: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
c7f0: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
c800: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
c810: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
c820: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
c830: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
c840: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
c850: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
c860: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
c870: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
c880: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
c890: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
c8a0: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
c8b0: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
c8c0: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
c8d0: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
c8e0: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
c8f0: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
c900: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c910: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
c920: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
c930: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
c940: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
c950: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
c960: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
c970: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
c980: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
c990: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
c9a0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
c9b0: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
c9c0: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
c9d0: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
c9e0: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
c9f0: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
ca00: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
ca10: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ca20: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
ca30: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
ca40: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
ca50: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
ca60: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
ca70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ca80: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
ca90: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
caa0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
cab0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
cac0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
cad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
cae0: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
caf0: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
cb00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e  pParse->db, p, n
cb10: 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
cb20: 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79 43  t( nEq!=p->nKeyC
cb30: 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ol || aff==SQLIT
cb40: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
cb50: 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
cb60: 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
cb70: 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
cb80: 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
cb90: 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20  if( nEq==0 ){.  
cba0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
cbb0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
cbc0: 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a   = p->nRowEst0;.
cbd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cbe0: 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
cbf0: 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
cc00: 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
cc10: 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
cc20: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
cc30: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
cc40: 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
cc50: 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
cc60: 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
cc70: 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
cc80: 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
cc90: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
cca0: 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
ccb0: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
ccc0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
ccd0: 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
cce0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
ccf0: 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30  ssert( pLower==0
cd00: 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   || (pLower->eOp
cd10: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
cd20: 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
cd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
cd40: 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
cd50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
cd60: 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
cd70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cd80: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d   p->aSortOrder!=
cd90: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
cda0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
cdb0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
cdc0: 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f  The roles of pLo
cdd0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61  wer and pUpper a
cde0: 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61  re swapped for a
cdf0: 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20   DESC index */. 
ce00: 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72         SWAP(Wher
ce10: 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20  eTerm*, pLower, 
ce20: 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d  pUpper);.      }
ce30: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
ce40: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
ce50: 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
ce60: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
ce70: 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
ce80: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
ce90: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
cec0: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
ced0: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
cee0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
cef0: 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
cf00: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
cf10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
cf20: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
cf30: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
cf40: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
cf50: 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
cf60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cf70: 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
cf80: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
cf90: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cfa0: 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
cfb0: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
cfc0: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
cfe0: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
cff0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
d000: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
d010: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d020: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
d030: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
d040: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d050: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d060: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
d070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d080: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
d090: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
d0a0: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
d0b0: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
d0c0: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
d0d0: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
d0e0: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
d110: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
d120: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
d130: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
d140: 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
d150: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
d160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
d170: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
d180: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
d190: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
d1a0: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
d1b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d1c0: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
d1d0: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
d1e0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d1f0: 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iUprIdx = whereK
d200: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d210: 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
d220: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
d230: 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
d240: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
d250: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
d260: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
d270: 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70      if( iNew<iUp
d280: 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69  per ) iUpper = i
d290: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
d2a0: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
d2b0: 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20   pUpper = 0;.   
d2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
d2d0: 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
d2e0: 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
d2f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d310: 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
d320: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  r ){.          n
d330: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  New = sqlite3Log
d340: 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  Est(iUpper - iLo
d350: 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wer);.          
d360: 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62  /* TUNING:  If b
d370: 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69  oth iUpper and i
d380: 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65  Lower are derive
d390: 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  d from the same.
d3a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
d3b0: 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  ple, then assume
d3c0: 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72   they are 4x mor
d3d0: 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68  e selective.  Th
d3e0: 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20  is brings.      
d3f0: 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d      ** the estim
d400: 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79  ated selectivity
d410: 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69   more in line wi
d420: 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64  th what it would
d430: 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
d440: 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69   if estimated wi
d450: 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66  thout the use of
d460: 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e   STAT3/4 tables.
d470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d480: 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49  ( iLwrIdx==iUprI
d490: 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  dx ) nNew -= 20;
d4a0: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
d4b0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
d4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
d4e0: 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 10;        ass
d4f0: 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
d500: 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
d510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d520: 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
d530: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d            nOut =
d540: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
d550: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
d560: 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54  ACE(0x10, ("STAT
d570: 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75  4 range scan: %u
d580: 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c  ..%u  est=%d\n",
d590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
d5b0: 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
d5c0: 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
d5d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d5e0: 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65  .      int bDone
d5f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
d600: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
d610: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
d620: 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70  Lower, pUpper, p
d630: 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20  Loop, &bDone);. 
d640: 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29       if( bDone )
d650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d660: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
d670: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d680: 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
d690: 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c  _PARAMETER(pBuil
d6a0: 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  der);.  assert( 
d6b0: 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
d6c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
d6d0: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
d6e0: 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61  | (pUpper->wtFla
d6f0: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
d700: 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  ==0 );.  nNew = 
d710: 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
d720: 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a  (pLower, nOut);.
d730: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
d740: 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72  ngeAdjust(pUpper
d750: 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54  , nNew);..  /* T
d760: 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
d770: 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
d780: 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74   and lower limit
d790: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d   and neither lim
d7a0: 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61  it.  ** has an a
d7b0: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
d7c0: 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  ed likelihood(),
d7d0: 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
d7e0: 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
d7f0: 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
d800: 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
d810: 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
d820: 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
d830: 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
d840: 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
d850: 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
d860: 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
d870: 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
d880: 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
d890: 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
d8a0: 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
d8b0: 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
d8c0: 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
d8d0: 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
d8e0: 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
d8f0: 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77  ( pLower && pLow
d900: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
d910: 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70  && pUpper && pUp
d920: 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  per->truthProb>0
d930: 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
d940: 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20  20;.  }..  nOut 
d950: 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b  -= (pLower!=0) +
d960: 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20   (pUpper!=0);.  
d970: 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e  if( nNew<10 ) nN
d980: 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e  ew = 10;.  if( n
d990: 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20  New<nOut ) nOut 
d9a0: 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69  = nNew;.#if defi
d9b0: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
d9c0: 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c  NABLED).  if( pL
d9d0: 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  oop->nOut>nOut )
d9e0: 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
d9f0: 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63  (0x10,("Range sc
da00: 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66  an lowers nOut f
da10: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
da20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da30: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
da40: 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65  , nOut));.  }.#e
da50: 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ndif.  pLoop->nO
da60: 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
da70: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
da80: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
da90: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
daa0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
dab0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
dac0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
dad0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
dae0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
daf0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
db00: 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
db10: 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
db20: 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
db30: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
db40: 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
db50: 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
db60: 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
db70: 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
db80: 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
db90: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
dba0: 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
dbb0: 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
dbc0: 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
dbd0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
dbe0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
dbf0: 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
dc00: 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
dc10: 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
dc20: 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
dc30: 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
dc40: 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
dc50: 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
dc60: 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
dc70: 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
dc80: 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
dc90: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
dca0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
dcb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
dcc0: 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
dcd0: 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
dce0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
dcf0: 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
dd00: 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
dd10: 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
dd20: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
dd30: 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
dd40: 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
dd50: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
dd60: 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
dd70: 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
dd80: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
dd90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
dda0: 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
ddb0: 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
ddc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ddd0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
dde0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
ddf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
de00: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
de10: 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
de20: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
de30: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
de40: 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
de50: 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
de60: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
de70: 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
de80: 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
de90: 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
dea0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
deb0: 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
dec0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
ded0: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
dee0: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
def0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
df00: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
df10: 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
df20: 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
df50: 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
df60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df70: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
df80: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
df90: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
dfa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dfb0: 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
dfc0: 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
dfd0: 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
dfe0: 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
dff0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
e000: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e010: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e020: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
e030: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
e040: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
e050: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
e060: 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
e070: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
e080: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
e090: 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
e0a0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
e0b0: 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
e0c0: 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
e0d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e0e0: 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
e0f0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e100: 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
e110: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e120: 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
e130: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
e140: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
e150: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
e160: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e170: 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
e180: 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
e190: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
e1a0: 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
e1b0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
e1c0: 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
e1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e1e0: 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 73  ;.  }..  aff = s
e1f0: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
e200: 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  nAffinity(pParse
e210: 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29 3b  ->db, p, nEq-1);
e220: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
e230: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e240: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
e250: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
e260: 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
e270: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
e280: 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
e290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e2a0: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
e2b0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
e2c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
e2d0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e2e0: 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
e2f0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
e300: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
e310: 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
e320: 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
e330: 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25  y scan regions %
e340: 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20  s(%d): %d\n",.  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31   p->zName, nEq-1
e370: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
e380: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
e390: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
e3a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e3b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e3c0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
e3d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e3e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e3f0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e400: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
e410: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
e420: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
e430: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
e440: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
e450: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e460: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e470: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
e480: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
e490: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
e4a0: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
e4b0: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
e4c0: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
e4d0: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
e4e0: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
e4f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
e500: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
e510: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
e520: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
e530: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
e540: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
e550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e560: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
e570: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
e580: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
e590: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
e5a0: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
e5b0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
e5c0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
e5d0: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
e5e0: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
e5f0: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
e600: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
e610: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
e620: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
e630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
e640: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
e650: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
e660: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e670: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
e680: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
e690: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e6a0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
e6b0: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
e6c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
e6d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
e6e0: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
e6f0: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
e700: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
e710: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
e720: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
e730: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
e740: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
e750: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
e760: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
e770: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
e780: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
e790: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
e7a0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
e7b0: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
e7c0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e7d0: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
e7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
e7f0: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
e800: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
e810: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
e820: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e830: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
e840: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
e850: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
e860: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
e870: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
e880: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
e890: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e8a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e8b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e8c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
e8d0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
e8e0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e8f0: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
e900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e910: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
e920: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
e930: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
e940: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
e950: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
e960: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
e970: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
e980: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e990: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
e9a0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
e9b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e9c0: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
e9d0: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
e9e0: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
e9f0: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
ea00: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
ea10: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
ea20: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
ea30: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
ea40: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ea50: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
ea60: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
ea70: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
ea80: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
ea90: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
eaa0: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
eab0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
eac0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
ead0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
eae0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
eaf0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
eb00: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
eb10: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
eb20: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
eb30: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
eb40: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
eb50: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
eb60: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
eb70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
eb80: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68  zType[4];.    ch
eb90: 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20  ar zLeft[50];.  
eba0: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
ebb0: 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
ebc0: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
ebd0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
ebe0: 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
ebf0: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
ec00: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
ec10: 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
ec20: 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
ec30: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ec40: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
ec50: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
ec60: 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
ec70: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ec80: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
ec90: 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  GLE ){.      sql
eca0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
ecb0: 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66  zeof(zLeft),zLef
ecc0: 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22  t,"left={%d:%d}"
ecd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ece0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
ecf0: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
ed00: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29  m->u.leftColumn)
ed10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ed20: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
ed30: 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26  r & WO_OR)!=0 &&
ed40: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
ed50: 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o!=0 ){.      sq
ed60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
ed70: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ed80: 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30 78  ft,"indexable=0x
ed90: 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20 20  %lld", .        
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
edb0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
edc0: 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20 20  >indexable);.   
edd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ede0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
edf0: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ee00: 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70 54  ft,"left=%d", pT
ee10: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
ee20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ee30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
ee40: 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33         "TERM-%-3
ee50: 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70 72  d %p %s %-12s pr
ee60: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
ee70: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
ee80: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72  \n",.       iTer
ee90: 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
eea0: 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74   zLeft, pTerm->t
eeb0: 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20  ruthProb,.      
eec0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
eed0: 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  r, pTerm->wtFlag
eee0: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  s);.    sqlite3T
eef0: 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 70  reeViewExpr(0, p
ef00: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Term->pExpr, 0);
ef10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
ef20: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
ef30: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
ef40: 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  how the complete
ef50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68   content of a Wh
ef60: 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69  ereClause.*/.voi
ef70: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c  d sqlite3WhereCl
ef80: 61 75 73 65 50 72 69 6e 74 28 57 68 65 72 65 43  ausePrint(WhereC
ef90: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
efa0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
efb0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
efc0: 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65 54 65  ++){.    whereTe
efd0: 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b  rmPrint(&pWC->a[
efe0: 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65  i], i);.  }.}.#e
eff0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45  ndif..#ifdef WHE
f000: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f010: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68  /*.** Print a Wh
f020: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66  ereLoop object f
f030: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72  or debugging pur
f040: 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
f050: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72  void whereLoopPr
f060: 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  int(WhereLoop *p
f070: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
f080: 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  WC){.  WhereInfo
f090: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
f0a0: 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62  pWInfo;.  int nb
f0b0: 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54   = 1+(pWInfo->pT
f0c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f  abList->nSrc+3)/
f0d0: 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  4;.  struct SrcL
f0e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
f0f0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
f100: 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b  st->a + p->iTab;
f110: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
f120: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
f130: 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28  Bitmask mAll = (
f140: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e  ((Bitmask)1)<<(n
f150: 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c  b*4)) - 1;.  sql
f160: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f170: 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
f180: 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
f1b0: 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
f1c0: 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20 6d 41  , p->prereq & mA
f1d0: 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ll);.  sqlite3De
f1e0: 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
f1f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f200: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
f210: 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
f220: 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
f230: 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
f240: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f250: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
f260: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
f270: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
f280: 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
f290: 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
f2a0: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
f2b0: 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
f2c0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
f2d0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
f2e0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
f2f0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
f300: 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
f310: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
f320: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
f330: 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
f340: 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
f350: 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
f360: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f370: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
f380: 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
f390: 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
f3a0: 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
f3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f3c0: 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
f3d0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
f3e0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
f3f0: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
f400: 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
f410: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f420: 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
f430: 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
f440: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
f450: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
f460: 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
f470: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
f480: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f490: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f4a0: 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
f4b0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
f4c0: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
f4d0: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
f4e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f4f0: 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
f500: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f510: 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
f520: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
f530: 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
f540: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
f550: 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
f560: 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
f570: 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
f580: 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
f590: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
f5a0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
f5b0: 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
f5c0: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
f5d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
f5e0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
f5f0: 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
f600: 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
f610: 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
f620: 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
f630: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
f640: 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
f650: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
f660: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f670: 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
f680: 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
f690: 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
f6a0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
f6b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
f6c0: 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
f6d0: 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
f6e0: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
f6f0: 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
f700: 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
f710: 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
f720: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f730: 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
f740: 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
f750: 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
f760: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
f770: 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
f780: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
f790: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
f7a0: 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
f7b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
f7c0: 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
f7d0: 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
f7e0: 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
f7f0: 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
f800: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
f810: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
f820: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f830: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
f840: 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
f850: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
f860: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
f870: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
f880: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f890: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
f8a0: 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
f8b0: 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
f8c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
f8d0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
f8e0: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
f8f0: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
f900: 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
f910: 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
f920: 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
f930: 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
f940: 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
f950: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
f960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f980: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
f990: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
f9a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f9b0: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
f9c0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
f9d0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
f9e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
f9f0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
fa00: 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
fa10: 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
fa20: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
fa30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
fa40: 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
fa50: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
fa60: 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
fa70: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fa80: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fa90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
faa0: 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
fab0: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
fac0: 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
fad0: 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
fae0: 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
faf0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
fb00: 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
fb10: 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
fb20: 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
fb30: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
fb40: 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
fb50: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
fb60: 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
fb70: 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
fb80: 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
fb90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fba0: 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
fbb0: 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
fbc0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
fbd0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  NN(db, sizeof(p-
fbe0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
fbf0: 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
fc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fc10: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
fc20: 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
fc30: 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
fc40: 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
fc50: 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
fc60: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fc70: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fc80: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
fc90: 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
fca0: 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
fcb0: 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
fcc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fcd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
fce0: 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
fcf0: 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
fd00: 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
fd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
fd20: 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
fd30: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
fd40: 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
fd50: 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
fd60: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
fd70: 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
fd80: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
fd90: 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
fda0: 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
fdb0: 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
fdc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
fdd0: 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
fde0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
fdf0: 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  PT;.  }.  memcpy
fe00: 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45  (pTo, pFrom, WHE
fe10: 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29  RE_LOOP_XFER_SZ)
fe20: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
fe30: 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61  aLTerm, pFrom->a
fe40: 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65  LTerm, pTo->nLTe
fe50: 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61  rm*sizeof(pTo->a
fe60: 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66  LTerm[0]));.  if
fe70: 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73  ( pFrom->wsFlags
fe80: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
fe90: 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72  TABLE ){.    pFr
fea0: 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  om->u.vtab.needF
feb0: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
fec0: 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46   if( (pFrom->wsF
fed0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
fee0: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
fef0: 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65     pFrom->u.btre
ff00: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
ff10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ff20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ff30: 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f  elete a WhereLoo
ff40: 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  p object.*/.stat
ff50: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
ff60: 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  pDelete(sqlite3 
ff70: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
ff80: 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  p){.  whereLoopC
ff90: 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73  lear(db, p);.  s
ffa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ffb0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
ffc0: 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
ffd0: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
ffe0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
fff0: 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
10000 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
10010 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
10020 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
10030 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10040 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
10050 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
10060 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20       WhereLevel 
10070 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
10080 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  o->a[i];.      i
10090 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
100a0 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
100b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
100c0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
100d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
100e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
100f0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
10100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10110 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
10120 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
10130 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
10140 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
10150 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
10160 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
10170 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
10180 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
10190 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
101a0 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
101b0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
101c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
101d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
101e0 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nfo);.  }.}../*.
101f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10200 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
10210 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10220 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
10230 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
10240 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
10250 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
10260 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10270 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20   of Y.**   (3)  
10280 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74  X skips at least
10290 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   as many columns
102a0 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   as Y.**.** By "
102b0 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
102c0 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
102d0 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
102e0 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
102f0 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
10300 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
10310 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
10320 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
10330 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
10340 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
10350 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
10360 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
10370 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
10380 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
10390 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
103a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
103b0 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
103c0 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
103d0 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
103e0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
103f0 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69  justed.  The thi
10400 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61  rd rule.** was a
10410 64 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20  dded because if 
10420 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e  X uses skip-scan
10430 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20   less than Y it 
10440 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64  still might.** d
10450 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63  eserve a lower c
10460 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69  ost even if it i
10470 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10480 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  t of Y..*/.stati
10490 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
104a0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
104b0 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
104c0 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
104d0 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
104e0 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
104f0 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
10500 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
10510 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
10520 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
10530 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
10540 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
10550 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d  erm-pX->nSkip >=
10560 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e   pY->nLTerm-pY->
10570 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74  nSkip ){.    ret
10580 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e  urn 0; /* X is n
10590 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
105a0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59   */.  }.  if( pY
105b0 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53  ->nSkip > pX->nS
105c0 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  kip ) return 0;.
105d0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
105e0 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
105f0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
10600 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
10610 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
10620 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
10630 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
10640 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
10650 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
10660 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
10670 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
10680 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
10690 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
106a0 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d    if( pX->aLTerm
106b0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
106c0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  e;.    for(j=pY-
106d0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
106e0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
106f0 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
10700 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
10710 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10720 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
10730 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
10740 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
10750 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
10760 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
10770 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
10780 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
10790 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
107a0 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
107b0 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
107c0 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
107d0 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
107e0 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
107f0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
10800 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
10810 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
10820 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
10830 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
10840 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
10850 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
10860 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
10870 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10880 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
10890 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
108a0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
108b0 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
108c0 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
108d0 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
108e0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
108f0 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
10900 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
10910 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
10920 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
10930 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
10940 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10950 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
10960 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
10970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10980 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
10990 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
109a0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
109b0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
109c0 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
109d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
109e0 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
109f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
10a00 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
10a10 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
10a20 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
10a30 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
10a40 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
10a50 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10a60 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
10a70 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
10a80 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
10a90 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
10aa0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
10ab0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
10ac0 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
10ad0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
10ae0 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
10af0 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
10b00 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45   p. */.      WHE
10b10 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
10b20 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
10b30 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
10b40 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
10b70 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10b80 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
10b90 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut-1));.      pT
10ba0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
10bb0 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
10bc0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
10bd0 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
10be0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
10bf0 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
10c00 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
10c10 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
10c20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
10c30 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
10c40 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
10c50 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
10c60 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
10c70 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
10c80 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
10c90 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10ca0 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10cb0 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10cc0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10cd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10ce0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
10cf0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
10d00 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
10d10 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29  rRun, p->nOut+1)
10d20 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
10d30 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
10d40 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10d50 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10d60 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  Out + 1;.    }. 
10d70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72   }.}../*.** Sear
10d80 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  ch the list of W
10d90 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70  hereLoops in *pp
10da0 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  Prev looking for
10db0 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65   one that can be
10dc0 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62  .** supplanted b
10dd0 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  y pTemplate..**.
10de0 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
10df0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
10e00 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  list contains an
10e10 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20   entry that can 
10e20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d  supplant.** pTem
10e30 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20  plate, in other 
10e40 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
10e50 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
10e60 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ng on the list..
10e70 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61  **.** If pX is a
10e80 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
10e90 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75  pTemplate can su
10ea0 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74  pplant, then ret
10eb0 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20  urn the.** link 
10ec0 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  that points to p
10ed0 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d  X..**.** If pTem
10ee0 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70  plate cannot sup
10ef0 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69  plant any existi
10f00 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
10f10 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73  e list but needs
10f20 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20  .** to be added 
10f30 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65  to the list, the
10f40 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
10f50 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f  er to the tail o
10f60 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  f the list..*/.s
10f70 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20  tatic WhereLoop 
10f80 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  **whereLoopFindL
10f90 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f  esser(.  WhereLo
10fa0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63  op **ppPrev,.  c
10fb0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10fc0 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57  pTemplate.){.  W
10fd0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66  hereLoop *p;.  f
10fe0 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20  or(p=(*ppPrev); 
10ff0 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
11000 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
11010 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
11020 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
11030 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
11040 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
11050 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
11060 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
11070 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
11080 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
11090 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
110a0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
110b0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
110c0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
110d0 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
110e0 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
110f0 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
11100 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
11110 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
11120 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
11130 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
11140 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
11150 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
11160 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
11170 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
11180 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
11190 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
111a0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
111b0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
111c0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
111d0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
111e0 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
111f0 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
11200 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11210 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
11220 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11240 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
11250 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11260 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
11270 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
11280 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
11290 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
112a0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
112b0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
112c0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
112d0 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
112e0 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
112f0 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
11300 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
11310 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
11320 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
11330 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
11340 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
11350 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79  p );..    /* Any
11360 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61   loop using an a
11370 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65  ppliation-define
11380 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d  d index (or PRIM
11390 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a  ARY KEY or.    *
113a0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
113b0 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72  int) with one or
113c0 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61   more == constra
113d0 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20  ints is better. 
113e0 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75     ** than an au
113f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55  tomatic index. U
11400 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b  nless it is a sk
11410 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ip-scan. */.    
11420 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
11430 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
11440 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EX)!=0.     && (
11450 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70  pTemplate->nSkip
11460 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
11470 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11480 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11490 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
114a0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
114b0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
114c0 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EQ)!=0.     && (
114d0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
114e0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
114f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11500 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  q.    ){.      b
11510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11520 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20   /* If existing 
11530 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
11540 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
11550 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20  late, pTemplate 
11560 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69  can be.    ** di
11570 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c  scarded.  WhereL
11580 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
11590 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
115a0 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20    p has no more 
115b0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
115c0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64  n pTemplate, and
115d0 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
115e0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
115f0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11600 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a   pTemplate.    *
11610 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
11620 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
11630 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
11640 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20  ereq    /* (1)  
11650 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  */.     && p->rS
11660 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
11670 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20  >rSetup         
11680 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
11690 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
116a0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
116b0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
116c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
116d0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
116e0 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
116f0 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11710 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  c) */.    ){.   
11720 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
11730 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61   Discard pTempla
11740 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  te */.    }..   
11750 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65   /* If pTemplate
11760 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65   is always bette
11770 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63  r than p, then c
11780 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
11790 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20  rwritten.    ** 
117a0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20  with pTemplate. 
117b0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65   pTemplate is be
117c0 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a  tter than p if:.
117d0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54      **   (1)  pT
117e0 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d  emplate has no m
117f0 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20  ore dependences 
11800 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20  than p, and.    
11810 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c  **   (2)  pTempl
11820 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c  ate has an equal
11830 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11840 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  han p..    */.  
11850 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
11860 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
11870 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
11880 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31  ->prereq   /* (1
11890 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
118a0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
118b0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
118e0 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
118f0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11920 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  b) */.    ){.   
11930 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11940 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
11950 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
11960 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
11970 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ove */.      bre
11980 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70  ak;   /* Cause p
11990 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
119a0 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  en by pTemplate 
119b0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
119c0 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a  eturn ppPrev;.}.
119d0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
119e0 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
119f0 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
11a00 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
11a10 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
11a20 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11a30 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
11a40 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
11a50 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
11a60 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
11a70 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
11a80 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
11a90 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
11aa0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
11ab0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
11ac0 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
11ad0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
11ae0 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
11af0 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
11b00 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
11b10 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
11b20 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
11b30 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
11b40 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ded based on the
11b50 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a   template..**.**
11b60 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
11b70 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rSet is not NULL
11b80 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62   then we care ab
11b90 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
11ba0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
11bb0 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
11bc0 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
11bd0 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
11be0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
11bf0 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
11c00 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
11c10 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
11c20 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
11c30 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
11c40 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
11c50 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
11c60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
11c70 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
11c80 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
11c90 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11ca0 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
11cb0 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
11cc0 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
11cd0 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
11ce0 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
11cf0 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74  e.** new templat
11d00 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
11d10 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
11d20 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
11d30 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
11d40 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
11d50 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
11d60 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11d70 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
11d80 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
11d90 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
11da0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
11db0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
11dc0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
11dd0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
11de0 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
11df0 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
11e00 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
11e10 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11e20 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
11e30 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69  loop.*/.static i
11e40 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
11e50 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
11e60 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
11e70 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
11e80 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
11e90 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a  p **ppPrev, *p;.
11ea0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
11eb0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
11ec0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
11ed0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
11ee0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
11ef0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  t rc;..  /* If p
11f00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11f10 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
11f20 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
11f30 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
11f40 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
11f50 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
11f60 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
11f70 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c  {.    if( pTempl
11f80 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23  ate->nLTerm ){.#
11f90 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11fa0 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20  ABLED.      u16 
11fb0 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  n = pBuilder->pO
11fc0 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69  rSet->n;.      i
11fd0 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20  nt x =.#endif.  
11fe0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
11ff0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
12000 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
12010 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
12020 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
12050 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
12060 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12070 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
12080 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12090 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
120a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
120b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
120c0 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
120d0 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
120e0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
120f0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
12100 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
12110 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
12120 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  f.    }.    retu
12130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12140 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  }..  /* Look for
12150 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
12160 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63  reLoop to replac
12170 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  e with pTemplate
12180 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f  .  */.  whereLoo
12190 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e  pAdjustCost(pWIn
121a0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
121b0 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76  plate);.  ppPrev
121c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
121d0 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e  Lesser(&pWInfo->
121e0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
121f0 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65  e);..  if( ppPre
12200 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  v==0 ){.    /* T
12210 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
12220 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  sts a WhereLoop 
12230 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  on the list that
12240 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
12250 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  * than pTemplate
12260 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65  , so just ignore
12270 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69   pTemplate */.#i
12280 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12290 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
122a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
122b0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
122c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
122d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73  ebugPrintf("   s
122e0 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  kip: ");.      w
122f0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12300 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12310 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23  r->pWC);.    }.#
12320 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
12330 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20   SQLITE_OK;  .  
12340 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a  }else{.    p = *
12350 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f  ppPrev;.  }..  /
12360 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
12370 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
12380 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
12390 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
123a0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
123b0 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
123c0 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
123d0 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
123e0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
123f0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
12400 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
12410 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
12420 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
12430 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
12440 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
12450 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
12460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12470 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65  3DebugPrintf("re
12480 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20  place: ");.     
12490 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
124a0 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  p, pBuilder->pWC
124b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
124c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
124d0 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20  "    add: ");.  
124e0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
124f0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12500 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
12510 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
12520 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
12530 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
12540 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
12550 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
12560 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
12570 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
12580 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
12590 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
125a0 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
125b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
125c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
125d0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
125e0 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  p);.    p->pNext
125f0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Loop = 0;.  }els
12600 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c  e{.    /* We wil
12610 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67  l be overwriting
12620 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20   WhereLoop p[]. 
12630 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64   But before we d
12640 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  o, first.    ** 
12650 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  go through the r
12660 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  est of the list 
12670 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f  and delete any o
12680 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73  ther entries bes
12690 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20  ides.    ** p[] 
126a0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75  that are also su
126b0 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70  pplated by pTemp
126c0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72  late */.    Wher
126d0 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d  eLoop **ppTail =
126e0 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a   &p->pNextLoop;.
126f0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
12700 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65  ToDel;.    while
12710 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20  ( *ppTail ){.   
12720 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72     ppTail = wher
12730 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12740 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74  ppTail, pTemplat
12750 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70  e);.      if( pp
12760 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tail==0 ) break;
12770 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
12780 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
12790 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
127a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
127b0 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
127c0 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
127d0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
127e0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
127f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
12800 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
12810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
12820 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65  bugPrintf(" dele
12830 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  te: ");.        
12840 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12850 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
12860 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
12870 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
12880 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
12890 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
128a0 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c   }.  rc = whereL
128b0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
128c0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
128d0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
128e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
128f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
12900 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
12910 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
12920 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12930 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
12940 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
12950 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
12960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12980 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
12990 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
129a0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
129b0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
129c0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
129d0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
129e0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
129f0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
12a00 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
12a10 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65  ndex..*.** For e
12a20 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12a30 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12a40 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12a50 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12a60 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72  h has a truth pr
12a70 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e  obability assign
12a80 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
12a90 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a   likelihood(),.*
12aa0 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75  * likely(), or u
12ab0 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75  nlikely() SQL fu
12ac0 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20  nctions, reduce 
12ad0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
12ae0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75  mber.** of outpu
12af0 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72  t rows by the pr
12b00 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66  obability specif
12b10 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e  ied..**.** TUNIN
12b20 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48  G:  For every WH
12b30 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12b40 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
12b50 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
12b60 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20   and which does 
12b70 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69  not have an assi
12b80 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61  gned truth proba
12b90 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69  bility, heuristi
12ba0 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  cs.** described 
12bb0 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74  below are used t
12bc0 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
12bd0 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12be0 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f  ability..** TODO
12bf0 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69   --> Perhaps thi
12c00 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
12c10 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  hat could be imp
12c20 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a  roved by better.
12c30 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74  ** table statist
12c40 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  ics..**.** Heuri
12c50 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74  stic 1:  Estimat
12c60 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12c70 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35  ability as 93.75
12c80 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a  %.  The 93.75%.*
12c90 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f  * value correspo
12ca0 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67  nds to -1 in Log
12cb0 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f  Est notation, so
12cc0 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72   this means decr
12cd0 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65  ement.** the Whe
12ce0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c  reLoop.nOut fiel
12cf0 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68  d for every such
12d00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12d10 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  rm..**.** Heuris
12d20 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65  tic 2:  If there
12d30 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
12d40 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
12d50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12d60 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20   form "x==EXPR" 
12d70 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20  and EXPR is not 
12d80 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20  a constant 0 or 
12d90 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  1, then make sur
12da0 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f  e the.** final o
12db0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
12dc0 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72  te is no greater
12dd0 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65   than 1/4 of the
12de0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a   total number.**
12df0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
12e00 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
12e10 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74   words, assume t
12e20 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c  hat x==EXPR will
12e30 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61   filter.** out a
12e40 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66  t least 3 out of
12e50 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50   4 rows.  If EXP
12e60 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20  R is -1 or 0 or 
12e70 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68  1, then maybe th
12e80 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20  e.** "x" column 
12e90 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c  is boolean or el
12ea0 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20  se -1 or 0 or 1 
12eb0 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61  is a common defa
12ec0 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20  ult value.** on 
12ed0 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61  the "x" column a
12ee0 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  nd so in that ca
12ef0 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20  se only cap the 
12f00 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
12f10 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e  ate.** at 1/2 in
12f20 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f  stead of 1/4..*/
12f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
12f40 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
12f50 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  st(.  WhereClaus
12f60 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
12f70 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
12f80 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
12f90 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20  *pLoop,      /* 
12fa0 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75  The loop to adju
12fb0 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20  st downward */. 
12fc0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20   LogEst nRow    
12fd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12fe0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
12ff0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
13000 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
13010 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
13020 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
13030 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
13040 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
13050 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
13060 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52  , k;.  LogEst iR
13070 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a  educe = 0;    /*
13080 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f   pLoop->nOut sho
13090 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e  uld not exceed n
130a0 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a  Row-iReduce */..
130b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
130c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
130d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
130e0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   );.  for(i=pWC-
130f0 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
13100 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
13110 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
13120 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
13130 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
13140 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
13150 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13160 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
13170 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
13180 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13190 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
131a0 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
131b0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
131c0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
131d0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
131e0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
131f0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
13200 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
13210 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
13220 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
13230 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13240 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
13250 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
13260 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
13270 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
13280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
13290 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
132a0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
132b0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
132c0 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f  * If a truth pro
132d0 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63  bability is spec
132e0 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  ified using the 
132f0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e  likelihood() hin
13300 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts,.        ** t
13310 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62  hen use the prob
13320 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64  ability provided
13330 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
13340 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
13350 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
13360 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
13370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13380 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
13390 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69  absence of expli
133a0 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62  cit truth probab
133b0 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75  ilities, use heu
133c0 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20  ristics to.     
133d0 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65     ** guess a re
133e0 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70  asonable truth p
133f0 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20  robability. */. 
13400 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
13410 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  ut--;.        if
13420 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13430 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
13440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
13450 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
13460 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13470 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
13480 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
13490 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
134a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
134b0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
134c0 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29  eger(pRight, &k)
134d0 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b   && k>=(-1) && k
134e0 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=1 ){.         
134f0 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20     k = 10;.     
13500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13510 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a          k = 20;.
13520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13530 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63        if( iReduc
13540 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20  e<k ) iReduce = 
13550 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13570 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
13580 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20   > nRow-iReduce 
13590 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  )  pLoop->nOut =
135a0 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b   nRow - iReduce;
135b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
135c0 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74   the cost C by t
135d0 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74  he costMult fact
135e0 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79  er T.  This only
135f0 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f   occurs if.** co
13600 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51  mpiled with -DSQ
13610 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
13620 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53  MULT.*/.#ifdef S
13630 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
13640 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41  TMULT.# define A
13650 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
13660 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a  er(C,T)  C += T.
13670 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
13680 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
13690 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a  er(C,T).#endif..
136a0 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
136b0 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
136c0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
136d0 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
136e0 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20  f the .** index 
136f0 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d  pIndex. Try to m
13700 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
13710 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
13720 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13730 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  d, pBuilder->pNe
13740 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73  w->nOut contains
13750 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
13760 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64  of rows expected
13770 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62   to be visited b
13780 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e  y filtering usin
13790 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65  g the nEq .** te
137a0 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20  rms only. If it 
137b0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69  is modified, thi
137c0 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f  s value is resto
137d0 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  red before this 
137e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
137f0 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  urns..**.** If p
13800 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
13810 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
13820 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
13830 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
13840 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
13850 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
13860 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
13870 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
13880 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
13890 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
138a0 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
138b0 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
138c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
138d0 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
138e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
138f0 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
13900 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
13910 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
13920 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
13930 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f   on pSrc */.  Lo
13940 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  gEst nInMul     
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13960 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
13970 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
13980 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
13990 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
139a0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
139b0 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
139c0 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
139d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
139e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
139f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
13a00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13a10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13a20 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
13a30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13a40 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
13a50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
13a60 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
13a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13a80 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
13a90 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
13aa0 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
13ab0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
13ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
13ad0 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
13ae0 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
13af0 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
13b20 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
13b30 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
13b40 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
13b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
13b60 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
13b70 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
13b80 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
13b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
13ba0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
13bb0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
13bc0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
13bd0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
13be0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
13bf0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
13c00 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  erm */.  u16 sav
13c10 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
13c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
13c30 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
13c40 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
13c50 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
13c60 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
13c70 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
13c80 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
13c90 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
13ca0 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
13cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
13cc0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
13cd0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
13ce0 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
13cf0 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
13d00 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
13d10 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
13d20 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ut */.  int rc =
13d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13d40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
13d50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45  n code */.  LogE
13d60 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
13d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13d80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
13d90 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
13da0 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
13dd0 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
13de0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
13df0 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
13e00 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
13e10 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
13e20 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
13e30 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
13e40 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13e50 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
13e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13e70 50 54 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  PT;..  assert( (
13e80 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
13e90 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
13ea0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
13eb0 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
13ec0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
13ed0 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
13ee0 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
13ef0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
13f00 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
13f10 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
13f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61   }else{.    opMa
13f30 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
13f40 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
13f50 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53 4e 55  LT|WO_LE|WO_ISNU
13f60 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a 20 20  LL|WO_IS;.  }.  
13f70 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
13f80 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
13f90 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
13fa0 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
13fb0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
13fc0 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
13fd0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a  be->nColumn );..
13fe0 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e    saved_nEq = pN
13ff0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
14000 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d  .  saved_nSkip =
14010 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20   pNew->nSkip;.  
14020 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70  saved_nLTerm = p
14030 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73  New->nLTerm;.  s
14040 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70  aved_wsFlags = p
14050 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20  New->wsFlags;.  
14060 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70  saved_prereq = p
14070 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73  New->prereq;.  s
14080 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77  aved_nOut = pNew
14090 2d 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20  ->nOut;.  pTerm 
140a0 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
140b0 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
140c0 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
140d0 73 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a  sor, saved_nEq,.
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140f0 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20          opMask, 
14100 70 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d  pProbe);.  pNew-
14110 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72  >rSetup = 0;.  r
14120 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
14130 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
14140 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
14150 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72  og(rSize);.  for
14160 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
14170 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
14180 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
14190 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
141a0 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d   u16 eOp = pTerm
141b0 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f  ->eOperator;   /
141c0 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
141d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
141e0 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72   */.    LogEst r
141f0 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67  CostIdx;.    Log
14200 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  Est nOutUnadjust
14210 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f  ed;        /* nO
14220 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61  ut before IN() a
14230 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d  nd WHERE adjustm
14240 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
14250 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  nIn = 0;.#ifdef 
14260 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14270 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
14280 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
14290 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
142a0 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20  alid;.#endif.   
142b0 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53   if( (eOp==WO_IS
142c0 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
142d0 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
142e0 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
142f0 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
14300 6c 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64  ll(pProbe, saved
14310 5f 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  _nEq).    ){.   
14320 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20     continue; /* 
14330 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20  ignore IS [NOT] 
14340 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
14350 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c   on NOT NULL col
14360 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
14370 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
14380 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
14390 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
143a0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  inue;..    /* Do
143b0 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75   not allow the u
143c0 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20  pper bound of a 
143d0 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
143e0 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  n range constrai
143f0 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78  nt.    ** to mix
14400 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61   with a lower ra
14410 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73  nge bound from s
14420 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65  ome other source
14430 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
14440 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
14450 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65  M_LIKEOPT && pTe
14460 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
14470 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_LT ) continue;
14480 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
14490 61 6c 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61  allow IS constra
144a0 69 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48  ints from the WH
144b0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
144c0 20 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20   used by the.   
144d0 20 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20   ** right table 
144e0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
144f0 20 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74   Only constraint
14500 73 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  s in the ON clau
14510 73 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c  se are.    ** al
14520 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  lowed */.    if(
14530 20 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74   (pSrc->fg.joint
14540 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
14550 30 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48  0.     && !ExprH
14560 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
14570 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
14580 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65  Join).     && (e
14590 4f 70 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49  Op & (WO_IS|WO_I
145a0 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29  SNULL))!=0.    )
145b0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
145c0 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b  ( eOp & WO_IS );
145d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
145e0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
145f0 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   );.      contin
14600 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ue;.    }..    p
14610 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
14620 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
14630 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
14640 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
14650 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
14660 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
14670 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
14680 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
14690 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
146a0 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20  +1) ) break; /* 
146b0 4f 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  OOM */.    pNew-
146c0 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
146d0 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  Term++] = pTerm;
146e0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65  .    pNew->prere
146f0 71 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65  q = (saved_prere
14700 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  q | pTerm->prere
14710 71 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d  qRight) & ~pNew-
14720 3e 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20  >maskSelf;..    
14730 61 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d  assert( nInMul==
14740 30 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e  0.        || (pN
14750 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
14760 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
14770 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  !=0 .        || 
14780 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
14790 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
147a0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c  )!=0 .        ||
147b0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
147c0 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
147d0 29 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20  )!=0 .    );..  
147e0 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49    if( eOp & WO_I
147f0 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N ){.      Expr 
14800 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
14810 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
14820 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
14830 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
14840 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
14850 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14860 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
14870 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49  .        /* "x I
14880 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a  N (SELECT ...)":
14890 20 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45    TUNING: the SE
148a0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
148b0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
148c0 6e 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72  nIn = 46;  asser
148d0 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
148e0 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  gEst(25) );.    
148f0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
14900 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
14910 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t && pExpr->x.pL
14920 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
14930 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
14940 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
14950 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ..)" */.        
14960 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  nIn = sqlite3Log
14970 45 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Est(pExpr->x.pLi
14980 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
14990 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
149a0 28 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52  ( nIn>0 );  /* R
149b0 48 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20  HS always has 2 
149c0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e  or more terms...
149d0 20 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20    The parser.   
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20       ** changes 
14a00 22 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20  "x IN (?)" into 
14a10 22 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d  "x=?". */..    }
14a20 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28  else if( eOp & (
14a30 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a  WO_EQ|WO_IS) ){.
14a40 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
14a50 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
14a60 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20  n[saved_nEq];.  
14a70 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14a80 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
14a90 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65  N_EQ;.      asse
14aa0 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70  rt( saved_nEq==p
14ab0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14ac0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
14ad0 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20  ol==XN_ROWID .  
14ae0 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 30 20       || (iCol>0 
14af0 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20  && nInMul==0 && 
14b00 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62  saved_nEq==pProb
14b10 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20  e->nKeyCol-1).  
14b20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
14b30 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50  f( iCol>=0 && pP
14b40 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  robe->uniqNotNul
14b50 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
14b60 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
14b70 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  |= WHERE_UNQ_WAN
14b80 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  TED;.        }el
14b90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
14ba0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14bb0 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
14bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
14be0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
14bf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
14c00 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
14c10 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65  UMN_NULL;.    }e
14c20 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
14c30 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
14c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14c50 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20  Op & WO_GT );.  
14c60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14c70 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  p & WO_GE );.   
14c80 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
14c90 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
14ca0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
14cb0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42  _LIMIT;.      pB
14cc0 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  tm = pTerm;.    
14cd0 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20    pTop = 0;.    
14ce0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
14cf0 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
14d00 4f 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OPT ){.        /
14d10 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  * Range contrain
14d20 74 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f  ts that come fro
14d30 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  m the LIKE optim
14d40 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ization are.    
14d50 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73      ** always us
14d60 65 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a  ed in pairs. */.
14d70 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26          pTop = &
14d80 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20  pTerm[1];.      
14d90 20 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d    assert( (pTop-
14da0 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29  (pTerm->pWC->a))
14db0 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65  <pTerm->pWC->nTe
14dc0 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rm );.        as
14dd0 73 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c  sert( pTop->wtFl
14de0 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
14df0 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  PT );.        as
14e00 73 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65  sert( pTop->eOpe
14e10 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a  rator==WO_LT );.
14e20 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72          if( wher
14e30 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
14e40 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
14e50 72 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f  rm+1) ) break; /
14e60 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20  * OOM */.       
14e70 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
14e80 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
14e90 70 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e  pTop;.        pN
14ea0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
14eb0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
14ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14ed0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
14ee0 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f   eOp & (WO_LT|WO
14ef0 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65  _LE) );.      te
14f00 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
14f10 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
14f20 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
14f30 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  LE );.      pNew
14f40 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
14f50 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
14f60 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
14f70 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54  .      pTop = pT
14f80 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  erm;.      pBtm 
14f90 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  = (pNew->wsFlags
14fa0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
14fb0 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  IT)!=0 ?.       
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
14fd0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
14fe0 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a  >nLTerm-2] : 0;.
14ff0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
15000 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77   this point pNew
15010 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ->nOut is set to
15020 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
15030 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ows expected to.
15040 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65      ** be visite
15050 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73  d by the index s
15060 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69  can before consi
15070 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72  dering term pTer
15080 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  m, or the.    **
15090 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61   values of nIn a
150a0 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74  nd nInMul. In ot
150b0 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
150c0 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20  ing that all .  
150d0 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22    ** "x IN(...)"
150e0 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61   terms are repla
150f0 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22  ced with "x = ?"
15100 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64  . This block upd
15110 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ates.    ** the 
15120 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
15130 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  Out to account f
15140 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f  or pTerm (but no
15150 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20  t nIn/nInMul).  
15160 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
15170 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
15180 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28  _nOut );.    if(
15190 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26   pNew->wsFlags &
151a0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
151b0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
151c0 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e  Adjust nOut usin
151d0 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61  g stat3/stat4 da
151e0 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  ta. Or, if there
151f0 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61   is no stat3/sta
15200 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  t4.      ** data
15210 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68  , using some oth
15220 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f  er estimate.  */
15230 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
15240 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
15250 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c   pBuilder, pBtm,
15260 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20   pTop, pNew);.  
15270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
15280 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d  nt nEq = ++pNew-
15290 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
152a0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
152b0 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  & (WO_ISNULL|WO_
152c0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20  EQ|WO_IN|WO_IS) 
152d0 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
152e0 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61  ( pNew->nOut==sa
152f0 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20  ved_nOut );.    
15300 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
15310 74 68 50 72 6f 62 3c 3d 30 20 26 26 20 70 50 72  thProb<=0 && pPr
15320 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61  obe->aiColumn[sa
15330 76 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20  ved_nEq]>=0 ){. 
15340 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
15350 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20  eOp & WO_IN) || 
15360 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  nIn==0 );.      
15370 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
15380 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20  & WO_IN );.     
15390 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
153a0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
153b0 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  b;.        pNew-
153c0 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20  >nOut -= nIn;.  
153d0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
153e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
153f0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
15400 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e         tRowcnt n
15410 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Out = 0;.       
15420 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a   if( nInMul==0 .
15430 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f           && pPro
15440 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20  be->nSample .   
15450 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75        && pNew->u
15460 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f  .btree.nEq<=pPro
15470 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20  be->nSampleCol. 
15480 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70          && ((eOp
15490 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20   & WO_IN)==0 || 
154a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
154b0 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
154c0 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20  P_xIsSelect)).  
154d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
154e0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
154f0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
15500 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f           if( (eO
15510 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  p & (WO_EQ|WO_IS
15520 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20  NULL|WO_IS))!=0 
15530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
15540 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
15550 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
15560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
15570 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20  p & WO_IS );.   
15580 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
15590 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  e( eOp & WO_ISNU
155a0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  LL );.          
155b0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
155c0 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
155d0 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
155e0 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29  ->pRight, &nOut)
155f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
15600 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
15610 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45  c = whereInScanE
15620 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c  st(pParse, pBuil
15630 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  der, pExpr->x.pL
15640 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20  ist, &nOut);.   
15650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15670 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
15680 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15690 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
156a0 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
156b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
156c0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54  mp out of the pT
156d0 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  erm loop */.    
156e0 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29        if( nOut )
156f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
15700 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74  ew->nOut = sqlit
15710 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a  e3LogEst(nOut);.
15720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15730 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64  pNew->nOut>saved
15740 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f  _nOut ) pNew->nO
15750 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
15760 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
15770 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
15780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
157a0 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64  ( nOut==0 ).#end
157b0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
157c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
157d0 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69  t += (pProbe->ai
157e0 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d  RowLogEst[nEq] -
157f0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
15800 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20  gEst[nEq-1]);.  
15810 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20          if( eOp 
15820 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
15830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55             /* TU
15840 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69  NING: If there i
15850 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  s no likelihood(
15860 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20  ) value, assume 
15870 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20  that a .        
15880 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e      ** "col IS N
15890 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ULL" expression 
158a0 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73  matches twice as
158b0 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20   many rows .    
158c0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63          ** as (c
158d0 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ol=?). */.      
158e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
158f0 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   += 10;.        
15900 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
15920 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78   /* Set rCostIdx
15930 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
15940 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65  visiting selecte
15950 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e  d rows in index.
15960 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74   Add.    ** it t
15970 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68  o pNew->rRun, wh
15980 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ich is currently
15990 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74   set to the cost
159a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
159b0 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20    ** seek only. 
159c0 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73  Then, if this is
159d0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
159e0 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63  index, add the c
159f0 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69  ost of.    ** vi
15a00 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20  siting the rows 
15a10 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
15a20 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74  e.  */.    rCost
15a30 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  Idx = pNew->nOut
15a40 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
15a50 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72  e->szIdxRow)/pSr
15a60 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  c->pTab->szTabRo
15a70 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  w;.    pNew->rRu
15a80 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
15a90 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72  tAdd(rLogSize, r
15aa0 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66  CostIdx);.    if
15ab0 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
15ac0 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
15ad0 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d  LY|WHERE_IPK))==
15ae0 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 ){.      pNew-
15af0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
15b00 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72  ogEstAdd(pNew->r
15b10 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  Run, pNew->nOut 
15b20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20  + 16);.    }.   
15b30 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
15b40 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  lier(pNew->rRun,
15b50 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d   pProbe->pTable-
15b60 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20  >costMult);..   
15b70 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20   nOutUnadjusted 
15b80 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20  = pNew->nOut;.  
15b90 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20    pNew->rRun += 
15ba0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
15bb0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
15bc0 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20  nInMul + nIn;.  
15bd0 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
15be0 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72  tAdjust(pBuilder
15bf0 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  ->pWC, pNew, rSi
15c00 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  ze);.    rc = wh
15c10 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
15c20 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a  uilder, pNew);..
15c30 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73      if( pNew->ws
15c40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
15c50 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20  LUMN_RANGE ){.  
15c60 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
15c70 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
15c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
15c90 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55  ew->nOut = nOutU
15ca0 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d  nadjusted;.    }
15cb0 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ..    if( (pNew-
15cc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15cd0 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20  _TOP_LIMIT)==0. 
15ce0 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62      && pNew->u.b
15cf0 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d  tree.nEq<pProbe-
15d00 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
15d10 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41        whereLoopA
15d20 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
15d30 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
15d40 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29  obe, nInMul+nIn)
15d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
15d60 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
15d70 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Out;.#ifdef SQLI
15d80 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
15d90 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75  OR_STAT4.    pBu
15da0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
15db0 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65   = nRecValid;.#e
15dc0 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  ndif.  }.  pNew-
15dd0 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f  >prereq = saved_
15de0 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e  prereq;.  pNew->
15df0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61  u.btree.nEq = sa
15e00 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d  ved_nEq;.  pNew-
15e10 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
15e20 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73  Skip;.  pNew->ws
15e30 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
15e40 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Flags;.  pNew->n
15e50 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
15e60 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ;.  pNew->nLTerm
15e70 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
15e80 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20  ..  /* Consider 
15e90 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61  using a skip-sca
15ea0 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
15eb0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
15ec0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
15ed0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68  available for th
15ee0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
15ef0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20  s of the index, 
15f00 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72 61  and if the avera
15f10 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  ge.  ** number o
15f20 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68 65  f repeats in the
15f30 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73   left-most terms
15f40 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e   is at least 18.
15f50 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
15f60 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20  magic number 18 
15f70 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74  is selected on t
15f80 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73 63  he basis that sc
15f90 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20  anning 17 rows. 
15fa0 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c   ** is almost al
15fb0 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68 61  ways quicker tha
15fc0 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20  n an index seek 
15fd0 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20  (even though if 
15fe0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  the index.  ** c
15ff0 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
16000 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20  an 2^17 rows we 
16010 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65  assume otherwise
16020 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
16030 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  of.  ** the code
16040 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20  ). And, even if 
16050 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68  it is not, it sh
16060 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20  ould not be too 
16070 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20  much slower. .  
16080 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
16090 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20  hand, the extra 
160a0 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20  seeks could end 
160b0 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69  up being signifi
160c0 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65  cantly.  ** more
160d0 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a   expensive.  */.
160e0 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71    assert( 42==sq
160f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20  lite3LogEst(18) 
16100 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e  );.  if( saved_n
16110 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a  Eq==saved_nSkip.
16120 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b     && saved_nEq+
16130 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  1<pProbe->nKeyCo
16140 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  l.   && pProbe->
16150 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20  noSkipScan==0.  
16160 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f   && pProbe->aiRo
16170 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45  wLogEst[saved_nE
16180 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e  q+1]>=42  /* TUN
16190 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72  ING: Minimum for
161a0 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20   skip-scan */.  
161b0 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c   && (rc = whereL
161c0 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e  oopResize(db, pN
161d0 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  ew, pNew->nLTerm
161e0 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  +1))==SQLITE_OK.
161f0 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20    ){.    LogEst 
16200 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nIter;.    pNew-
16210 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a  >u.btree.nEq++;.
16220 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b      pNew->nSkip+
16230 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  +;.    pNew->aLT
16240 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
16250 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ++] = 0;.    pNe
16260 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
16270 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20  ERE_SKIPSCAN;.  
16280 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65    nIter = pProbe
16290 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61  ->aiRowLogEst[sa
162a0 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62  ved_nEq] - pProb
162b0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
162c0 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20  aved_nEq+1];.   
162d0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
162e0 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e  Iter;.    /* TUN
162f0 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e  ING:  Because un
16300 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74  certainties in t
16310 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72  he estimates for
16320 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69   skip-scan queri
16330 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61  es,.    ** add a
16340 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61 63   1.375 fudge fac
16350 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70  tor to make skip
16360 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c  -scan slightly l
16370 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20  ess likely. */. 
16380 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20     nIter += 5;. 
16390 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
163a0 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
163b0 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
163c0 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c  , nIter + nInMul
163d0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  );.    pNew->nOu
163e0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
163f0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
16400 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
16410 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  q;.    pNew->nSk
16420 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
16430 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ;.    pNew->wsFl
16440 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
16450 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ags;.  }..  retu
16460 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16470 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
16480 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
16490 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
164a0 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
164b0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
164c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
164d0 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
164e0 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
164f0 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
16500 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
16510 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16520 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
16530 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
16540 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
16550 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
16560 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
16570 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
16580 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
16590 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
165a0 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
165b0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
165c0 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
165d0 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
165e0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
165f0 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  pOB;.  ExprList 
16600 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74  *aColExpr;.  int
16610 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20   ii, jj;..  if( 
16620 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
16630 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
16640 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69   if( (pOB = pBui
16650 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f  lder->pWInfo->pO
16660 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74  rderBy)==0 ) ret
16670 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d  urn 0;.  for(ii=
16680 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72  0; ii<pOB->nExpr
16690 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  ; ii++){.    Exp
166a0 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74  r *pExpr = sqlit
166b0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
166c0 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78  e(pOB->a[ii].pEx
166d0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  pr);.    if( pEx
166e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
166f0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
16700 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le==iCursor ){. 
16710 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
16720 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
16730 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  rn 1;.      for(
16740 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d  jj=0; jj<pIndex-
16750 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b  >nKeyCol; jj++){
16760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
16770 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  pr->iColumn==pIn
16780 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a  dex->aiColumn[jj
16790 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
167a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
167b0 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20  if( (aColExpr = 
167c0 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
167d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )!=0 ){.      fo
167e0 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
167f0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
16800 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
16810 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
16820 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63  jj]!=XN_EXPR ) c
16830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
16840 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
16850 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 61 43  Compare(pExpr,aC
16860 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d 2e 70 45  olExpr->a[jj].pE
16870 78 70 72 2c 69 43 75 72 73 6f 72 29 3d 3d 30 20  xpr,iCursor)==0 
16880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16890 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
168a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
168b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
168c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
168d0 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31   bitmask where 1
168e0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
168f0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16900 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  g column of.** t
16910 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64  he table is used
16920 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f   by an index.  O
16930 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33  nly the first 63
16940 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e   columns are con
16950 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
16960 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d  ic Bitmask colum
16970 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20  nsInIndex(Index 
16980 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
16990 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
169a0 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
169b0 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
169c0 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
169d0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
169e0 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
169f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
16a00 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
16a10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16a20 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
16a30 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
16a40 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
16a50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
16a60 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43  eturn m;.}../* C
16a70 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
16a80 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77   partial index w
16a90 69 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68  ith pPartIndexWh
16aa0 65 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a  ere can be used.
16ab0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
16ac0 74 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  t query.  Return
16ad0 20 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20   true if it can 
16ae0 62 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  be and false if 
16af0 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
16b00 6e 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61  nt whereUsablePa
16b10 72 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69  rtialIndex(int i
16b20 54 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65  Tab, WhereClause
16b30 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68   *pWC, Expr *pWh
16b40 65 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ere){.  int i;. 
16b50 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
16b60 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65  m;.  while( pWhe
16b70 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  re->op==TK_AND )
16b80 7b 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65  {.    if( !where
16b90 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
16ba0 65 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65  ex(iTab,pWC,pWhe
16bb0 72 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  re->pLeft) ) ret
16bc0 75 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72  urn 0;.    pWher
16bd0 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67  e = pWhere->pRig
16be0 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ht;.  }.  for(i=
16bf0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
16c00 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
16c10 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
16c20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
16c30 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
16c40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
16c50 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 78  rImpliesExpr(pEx
16c60 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
16c70 29 20 0a 20 20 20 20 20 26 26 20 28 21 45 78 70  ) .     && (!Exp
16c80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16c90 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
16ca0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
16cb0 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62  tJoinTable==iTab
16cc0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
16cd0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
16ce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16cf0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
16d00 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
16d10 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74  s for a single t
16d20 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
16d30 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
16d40 0a 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20  .** is idenfied 
16d50 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
16d60 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
16d70 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
16d80 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
16d90 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
16da0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
16db0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
16dc0 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
16dd0 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
16de0 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
16df0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
16e00 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
16e10 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
16e20 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
16e30 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
16e40 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
16e50 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
16e60 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
16e70 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
16ea0 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
16eb0 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ed0 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
16ee0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
16ef0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
16f00 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
16f10 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
16f20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
16f30 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
16f40 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
16f50 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
16f60 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
16f70 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
16f80 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
16f90 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
16fa0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
16fb0 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
16fc0 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
16fd0 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
16fe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
16ff0 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
17000 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
17010 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
17020 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
17030 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
17040 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
17050 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
17060 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
17070 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
17080 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
17090 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
170a0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
170b0 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
170c0 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
170d0 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
170e0 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
170f0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
17100 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
17110 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
17120 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
17130 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
17140 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
17150 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
17160 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
17170 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
17180 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
17190 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
171a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
171b0 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
171c0 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
171d0 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ip-scans..**.** 
171e0 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61  The estimated va
171f0 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73  lues (nRow, nVis
17200 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e  it, nSeek) often
17210 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65   contain a large
17220 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e   amount.** of un
17230 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20  certainty.  For 
17240 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f  this reason, sco
17250 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64  ring is designed
17260 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74   to pick plans t
17270 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c  hat.** "do the l
17280 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68  east harm" if th
17290 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20  e estimates are 
172a0 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72  inaccurate.  For
172b0 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c   example, a.** l
172c0 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20  og(nRow) factor 
172d0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
172e0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
172f0 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64  ndex scan in ord
17300 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68  er to.** bias th
17310 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76  e scoring in fav
17320 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  or of using an i
17330 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20  ndex, since the 
17340 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65  worst-case.** pe
17350 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69  rformance of usi
17360 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66  ng an index is f
17370 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  ar better than t
17380 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65  he worst-case pe
17390 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20  rformance.** of 
173a0 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
173b0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
173c0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
173d0 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
173e0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
173f0 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
17400 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
17410 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
17420 65 71 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  eq             /
17430 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
17440 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
17450 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
17460 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
17470 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
17480 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
17490 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
174a0 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
174b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
174c0 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
174d0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
174e0 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
174f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
17500 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
17510 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
17520 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  key */.  LogEst 
17530 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
17540 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
17550 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20  wLogEst[] value 
17560 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
17570 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c  x */.  i16 aiCol
17580 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
17590 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
175a0 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
175b0 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
175c0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
175d0 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
175e0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
175f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
17600 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
17610 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
17620 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
17630 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
17640 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
17650 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
17660 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
17670 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
17680 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
17690 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
176a0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
176b0 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
176c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
176d0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
17700 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f  an value */.  Lo
17710 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
17720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
17730 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
17740 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
17750 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
17760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
17770 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
17780 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
17790 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
177a0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
177b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
177c0 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
177d0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  lause */.  Table
177e0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
177f0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
17800 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
17810 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
17820 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
17830 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
17840 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
17850 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
17860 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
17870 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
17880 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54  pNew->iTab;.  pT
17890 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
178a0 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
178b0 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74  r->pWC;.  assert
178c0 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72  ( !IsVirtual(pSr
178d0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69  c->pTab) );..  i
178e0 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  f( pSrc->pIBInde
178f0 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
17900 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
17910 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
17920 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
17930 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
17940 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e  be = pSrc->pIBIn
17950 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
17960 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
17970 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
17980 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
17990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
179a0 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
179b0 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
179c0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
179d0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
179e0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
179f0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
17a00 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
17a10 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
17a20 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
17a30 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
17a40 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
17a50 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
17a60 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
17a70 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
17a80 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
17a90 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
17aa0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
17ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
17ac0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
17ad0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
17ae0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
17af0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
17b00 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
17b10 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
17b20 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
17b30 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
17b40 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
17b50 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
17b60 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
17b70 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
17b80 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
17b90 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
17ba0 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
17bb0 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
17bc0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69  szTabRow;.    ai
17bd0 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
17be0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
17bf0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
17c00 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73  ] = 0;.    pFirs
17c10 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
17c20 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
17c30 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  pSrc->fg.notInde
17c40 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
17c50 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
17c60 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
17c70 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
17c80 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
17c90 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
17ca0 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
17cb0 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
17cc0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
17cd0 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
17ce0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
17cf0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
17d00 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
17d10 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
17d20 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
17d30 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
17d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17d50 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
17d60 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
17d70 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
17d80 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
17d90 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  Set      /* Not 
17da0 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70  part of an OR op
17db0 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  timization */.  
17dc0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
17dd0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
17de0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
17df0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
17e00 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
17e10 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
17e20 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70  ndex)!=0.   && p
17e30 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30  Src->pIBIndex==0
17e40 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
17e50 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
17e60 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  e */.   && !pSrc
17e70 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20  ->fg.notIndexed 
17e80 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20    /* Has no NOT 
17e90 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a  INDEXED clause *
17ea0 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64  /.   && HasRowid
17eb0 28 70 54 61 62 29 20 20 20 20 20 20 20 20 20 2f  (pTab)         /
17ec0 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f  * Not WITHOUT RO
17ed0 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d  WID table. (FIXM
17ee0 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a  E: Why not?) */.
17ef0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
17f00 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20  isCorrelated /* 
17f10 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
17f20 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
17f30 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52  && !pSrc->fg.isR
17f40 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74  ecursive  /* Not
17f50 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d   a recursive com
17f60 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
17f70 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20  sion. */.  ){.  
17f80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75    /* Generate au
17f90 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f  to-index WhereLo
17fa0 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ops */.    Where
17fb0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
17fc0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
17fd0 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
17fe0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
17ff0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
18000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18010 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
18020 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
18030 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
18040 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
18050 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
18060 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
18070 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
18080 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
18090 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
180a0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
180b0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
180c0 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Skip = 0;.      
180d0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
180e0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
180f0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
18100 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
18110 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
18120 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f  pTerm;.        /
18130 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69  * TUNING: One-ti
18140 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70  me cost for comp
18150 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61  uting the automa
18160 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20  tic index is.   
18170 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65       ** estimate
18180 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32  d to be X*N*log2
18190 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
181a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
181b0 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s in.        ** 
181c0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
181d0 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65 72  indexed and wher
181e0 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74  e X is 7 (LogEst
181f0 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a  =28) for normal.
18200 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18210 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45  s or 1.375 (LogE
18220 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20  st=4) for views 
18230 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e 20  and subqueries. 
18240 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   The value.     
18250 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d     ** of X is sm
18260 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20  aller for views 
18270 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 73  and subqueries s
18280 6f 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79  o that the query
18290 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20   planner.       
182a0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65   ** will be more
182b0 20 61 67 67 72 65 73 73 69 76 65 20 61 62 6f 75   aggressive abou
182c0 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74  t generating aut
182d0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 66  omatic indexes f
182e0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  or.        ** th
182f0 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e  ose objects, sin
18300 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  ce there is no o
18310 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64  pportunity to ad
18320 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20  d schema.       
18330 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73   ** indexes on s
18340 75 62 71 75 65 72 69 65 73 20 61 6e 64 20 76 69  ubqueries and vi
18350 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ews. */.        
18360 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
18370 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
18380 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + 4;.        if(
18390 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
183a0 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  0 && (pTab->tabF
183b0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
183c0 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ral)==0 ){.     
183d0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
183e0 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20  p += 24;.       
183f0 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
18400 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
18410 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61  New->rSetup, pTa
18420 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
18430 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
18440 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b   Each index look
18450 75 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77  up yields 20 row
18460 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
18470 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   This.        **
18480 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   is more than th
18490 65 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66  e usual guess of
184a0 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20   10 rows, since 
184b0 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20  we have no way. 
184c0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f         ** of kno
184d0 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69  wing how selecti
184e0 76 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  ve the index wil
184f0 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e  l ultimately be.
18500 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20    It would.     
18510 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72     ** not be unr
18520 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  easonable to mak
18530 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63  e this value muc
18540 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20  h larger. */.   
18550 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
18560 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34  = 43;  assert( 4
18570 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
18580 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20  (20) );.        
18590 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
185a0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c  ite3LogEstAdd(rL
185b0 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75  ogSize,pNew->nOu
185c0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  t);.        pNew
185d0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
185e0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20  E_AUTO_INDEX;.  
185f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
18600 65 71 20 3d 20 6d 50 72 65 72 65 71 20 7c 20 70  eq = mPrereq | p
18610 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
18620 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
18630 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
18640 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
18650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18660 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
18670 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
18680 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f  IC_INDEX */..  /
18690 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
186a0 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66  indices.  */.  f
186b0 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  or(; rc==SQLITE_
186c0 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50  OK && pProbe; pP
186d0 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
186e0 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b  xt, iSortIdx++){
186f0 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
18700 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
18710 30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65  0.     && !where
18720 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
18730 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  ex(pSrc->iCursor
18740 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70  , pWC, pProbe->p
18750 50 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b  PartIdxWhere) ){
18760 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18770 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72   pNew->iTab!=pSr
18780 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  c->iCursor );  /
18790 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38  * See ticket [98
187a0 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20  d973b8f5] */.   
187b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
187c0 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69   Partial index i
187d0 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72  nappropriate for
187e0 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
187f0 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d     }.    rSize =
18800 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
18810 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65  gEst[0];.    pNe
18820 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
18830 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53   0;.    pNew->nS
18840 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  kip = 0;.    pNe
18850 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
18860 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
18870 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  x = 0;.    pNew-
18880 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
18890 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
188a0 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 70 4e 65  mPrereq;.    pNe
188b0 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
188c0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
188d0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
188e0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
188f0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
18900 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
18910 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
18920 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
18930 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
18940 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
18950 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
18960 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
18970 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
18980 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
18990 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
189a0 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
189b0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
189c0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
189d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
189e0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
189f0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
18a00 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
18a10 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
18a20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
18a30 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
18a40 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
18a50 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
18a60 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
18a70 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
18a80 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
18a90 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
18aa0 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
18ab0 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
18ac0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
18ad0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
18ae0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
18af0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
18b00 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
18b10 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
18b20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
18b30 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
18b40 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
18b50 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
18b60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
18b70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
18b80 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
18b90 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
18ba0 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
18bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
18bc0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
18bd0 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
18be0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
18bf0 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
18c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18c10 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
18c20 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
18c30 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
18c40 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
18c50 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
18c60 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
18c70 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
18c80 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
18c90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
18ca0 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
18cb0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
18cc0 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61   b.       || !Ha
18cd0 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
18ce0 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20      || ( m==0.  
18cf0 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65         && pProbe
18d00 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
18d10 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72           && (pPr
18d20 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  obe->szIdxRow<pT
18d30 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20  ab->szTabRow).  
18d40 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
18d50 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
18d60 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
18d70 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  SIRED)==0.      
18d80 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f     && sqlite3Glo
18d90 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
18da0 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70  s.         && Op
18db0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
18dc0 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
18dd0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76  ->db, SQLITE_Cov
18de0 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20  erIdxScan).     
18df0 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a       ).      ){.
18e00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53          pNew->iS
18e10 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
18e20 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20  rtIdx : 0;..    
18e30 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
18e40 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20  of visiting the 
18e50 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a  index rows is N*
18e60 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20  K, where K is.  
18e70 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
18e80 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65   1.1 and 3.0, de
18e90 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72  pending on the r
18ea0 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66  elative sizes of
18eb0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18ec0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
18ed0 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73  rows. If this is
18ee0 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20   a non-covering 
18ef0 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20  index scan,.    
18f00 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20      ** also add 
18f10 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
18f20 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20  ting table rows 
18f30 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20  (N*3.0).  */.   
18f40 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
18f50 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31  = rSize + 1 + (1
18f60 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
18f70 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52  ow)/pTab->szTabR
18f80 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
18f90 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
18fa0 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
18fb0 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
18fc0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a  pNew->rRun, rSiz
18fd0 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  e+16);.        }
18fe0 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
18ff0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
19000 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63  w->rRun, pTab->c
19010 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
19020 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75    whereLoopOutpu
19030 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65  tAdjust(pWC, pNe
19040 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20  w, rSize);.     
19050 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
19060 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
19070 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
19080 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
19090 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
190a0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
190b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
190c0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
190d0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
190e0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
190f0 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  be, 0);.#ifdef S
19100 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
19110 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
19120 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
19130 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e  eFree(pBuilder->
19140 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c  pRec);.    pBuil
19150 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
19160 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72   0;.    pBuilder
19170 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64  ->pRec = 0;.#end
19180 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
19190 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
191a0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
191b0 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
191c0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
191d0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
191e0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
191f0 42 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  BIndex ) break;.
19200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19210 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
19220 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
19230 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  ABLE../*.** Argu
19240 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69 73  ment pIdxInfo is
19250 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
19260 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73  ed with all cons
19270 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61 79  traints that may
19280 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20 74  .** be used by t
19290 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
192a0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
192b0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
192c0 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  Tab. This.** fun
192d0 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75  ction marks a su
192e0 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63 6f  bset of those co
192f0 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65  nstraints usable
19300 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a  , invokes the.**
19310 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
19320 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  od and adds the 
19330 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f  returned plan to
19340 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
19350 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73   A constraint is
19360 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20 69   marked usable i
19370 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67  f:.**.**   * Arg
19380 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e  ument mUsable in
19390 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74 73  dicates that its
193a0 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
193b0 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e  re available, an
193c0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69  d.**.**   * It i
193d0 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65  s not one of the
193e0 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63 69   operators speci
193f0 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78 63  fied in the mExc
19400 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65 64  lude mask passed
19410 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20 66  .**     as the f
19420 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 28  ourth argument (
19430 77 68 69 63 68 20 69 6e 20 70 72 61 63 74 69 63  which in practic
19440 65 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f 49  e is either WO_I
19450 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41  N or 0)..**.** A
19460 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71 20  rgument mPrereq 
19470 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62  is a mask of tab
19480 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
19490 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
194a0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
194b0 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
194c0 2e 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65  . These are adde
194d0 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70  d to the plans p
194e0 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20  rerequisites.** 
194f0 62 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64  before it is add
19500 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a  ed to pBuilder..
19510 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72  **.** Output par
19520 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20  ameter *pbIn is 
19530 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74  set to true if t
19540 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f  he plan added to
19550 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65   pBuilder.** use
19560 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f  s one or more WO
19570 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61  _IN terms, or fa
19580 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
19590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
195a0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
195b0 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  One(.  WhereLoop
195c0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
195d0 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  r,.  Bitmask mPr
195e0 65 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20  ereq,           
195f0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
19600 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  tables that must
19610 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42   be used. */.  B
19620 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20  itmask mUsable, 
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19640 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65  * Mask of usable
19650 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36   tables */.  u16
19660 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20 20   mExclude,      
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19680 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75 73  Exclude terms us
19690 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61 74  ing these operat
196a0 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ors */.  sqlite3
196b0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
196c0 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75  xInfo,   /* Popu
196d0 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f 72  lated object for
196e0 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20   xBestIndex */. 
196f0 20 69 6e 74 20 2a 70 62 49 6e 20 20 20 20 20 20   int *pbIn      
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66   /* OUT: True if
19720 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 20 49 4e   plan uses an IN
19730 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20  (...) op */.){. 
19740 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
19750 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
19760 43 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  C;.  struct sqli
19770 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
19780 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
19790 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
197a0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
197b0 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 20  t_usage *pUsage 
197c0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
197d0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
197e0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54  int i;.  int mxT
197f0 65 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  erm;.  int rc = 
19800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65  SQLITE_OK;.  Whe
19810 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70  reLoop *pNew = p
19820 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
19830 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
19840 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
19850 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 74 72  o->pParse;.  str
19860 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19870 20 2a 70 53 72 63 20 3d 20 26 70 42 75 69 6c 64   *pSrc = &pBuild
19880 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62  er->pWInfo->pTab
19890 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54  List->a[pNew->iT
198a0 61 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  ab];.  int nCons
198b0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
198c0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->nConstraint;.
198d0 0a 20 20 61 73 73 65 72 74 28 20 28 6d 55 73 61  .  assert( (mUsa
198e0 62 6c 65 20 26 20 6d 50 72 65 72 65 71 29 3d 3d  ble & mPrereq)==
198f0 6d 50 72 65 72 65 71 20 29 3b 0a 20 20 2a 70 62  mPrereq );.  *pb
19900 49 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  In = 0;.  pNew->
19910 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71  prereq = mPrereq
19920 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
19930 75 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74  usable flag on t
19940 68 65 20 73 75 62 73 65 74 20 6f 66 20 63 6f 6e  he subset of con
19950 73 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66  straints identif
19960 69 65 64 20 62 79 20 0a 20 20 2a 2a 20 61 72 67  ied by .  ** arg
19970 75 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65 20 61  uments mUsable a
19980 6e 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a  nd mExclude. */.
19990 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
199a0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
199b0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
199c0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
199d0 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
199e0 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
199f0 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
19a00 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
19a10 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43  rm *pTerm = &pWC
19a20 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54  ->a[pIdxCons->iT
19a30 65 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ermOffset];.    
19a40 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
19a50 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 70   = 0;.    if( (p
19a60 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
19a70 74 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54  t & mUsable)==pT
19a80 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
19a90 20 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d   .     && (pTerm
19aa0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 45  ->eOperator & mE
19ab0 78 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20 20 29  xclude)==0.    )
19ac0 7b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  {.      pIdxCons
19ad0 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
19ae0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e    }.  }..  /* In
19af0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74  itialize the out
19b00 70 75 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  put fields of th
19b10 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
19b20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 2a  info structure *
19b30 2f 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67  /.  memset(pUsag
19b40 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
19b50 61 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61  age[0])*nConstra
19b60 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  int);.  assert( 
19b70 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
19b80 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29 3b  FreeIdxStr==0 );
19b90 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
19ba0 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
19bb0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
19bc0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  .  pIdxInfo->ord
19bd0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
19be0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ;.  pIdxInfo->es
19bf0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
19c00 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
19c10 64 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49 64 78  double)2;.  pIdx
19c20 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
19c30 6f 77 73 20 3d 20 32 35 3b 0a 20 20 70 49 64 78  ows = 25;.  pIdx
19c40 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d  Info->idxFlags =
19c50 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
19c60 63 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69 74  colUsed = (sqlit
19c70 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e 63  e3_int64)pSrc->c
19c80 6f 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e  olUsed;..  /* In
19c90 76 6f 6b 65 20 74 68 65 20 76 69 72 74 75 61 6c  voke the virtual
19ca0 20 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64 65   table xBestInde
19cb0 78 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  x() method */.  
19cc0 72 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64  rc = vtabBestInd
19cd0 65 78 28 70 50 61 72 73 65 2c 20 70 53 72 63 2d  ex(pParse, pSrc-
19ce0 3e 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29  >pTab, pIdxInfo)
19cf0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
19d00 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72  urn rc;..  mxTer
19d10 6d 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74  m = -1;.  assert
19d20 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d  ( pNew->nLSlot>=
19d30 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20  nConstraint );. 
19d40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
19d50 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e  straint; i++) pN
19d60 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20  ew->aLTerm[i] = 
19d70 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
19d80 62 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a  b.omitMask = 0;.
19d90 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
19da0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
19db0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
19dc0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
19dd0 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
19de0 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
19df0 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
19e00 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65  ++){.    int iTe
19e10 72 6d 3b 0a 20 20 20 20 69 66 28 20 28 69 54 65  rm;.    if( (iTe
19e20 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61  rm = pUsage[i].a
19e30 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30  rgvIndex - 1)>=0
19e40 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
19e50 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  erm *pTerm;.    
19e60 20 20 69 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f    int j = pIdxCo
19e70 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
19e80 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d  .      if( iTerm
19e90 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20  >=nConstraint.  
19ea0 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20       || j<0.    
19eb0 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54     || j>=pWC->nT
19ec0 65 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  erm.       || pN
19ed0 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d  ew->aLTerm[iTerm
19ee0 5d 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  ]!=0.       || p
19ef0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d  IdxCons->usable=
19f00 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
19f10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19f20 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 73  ERROR;.        s
19f30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19f40 50 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49  Parse,"%s.xBestI
19f50 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ndex malfunction
19f60 22 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  ",pSrc->pTab->zN
19f70 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ame);.        re
19f80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19f90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19fa0 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61   iTerm==nConstra
19fb0 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  int-1 );.      t
19fc0 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b  estcase( j==0 );
19fd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19fe0 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
19ff0 20 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   );.      pTerm 
1a000 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
1a010 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1a020 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65   |= pTerm->prere
1a030 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  qRight;.      as
1a040 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
1a050 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
1a060 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69    pNew->aLTerm[i
1a070 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  Term] = pTerm;. 
1a080 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d       if( iTerm>m
1a090 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d  xTerm ) mxTerm =
1a0a0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 74 65   iTerm;.      te
1a0b0 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31  stcase( iTerm==1
1a0c0 35 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  5 );.      testc
1a0d0 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29  ase( iTerm==16 )
1a0e0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72  ;.      if( iTer
1a0f0 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
1a100 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
1a110 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
1a120 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
1a130 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1a140 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
1a150 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1a160 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
1a170 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  e that is constr
1a180 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63  ained by an IN c
1a190 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20  lause may not.  
1a1a0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65        ** consume
1a1b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1a1c0 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29  ause because (1)
1a1d0 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e   the order of IN
1a1e0 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 2a   terms.        *
1a1f0 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  * is not necessa
1a200 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
1a210 74 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74  the order of out
1a220 70 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20  put terms and.  
1a230 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c        ** (2) Mul
1a240 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72  tiple outputs fr
1a250 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76  om a single IN v
1a260 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65  alue will not me
1a270 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  rge.        ** t
1a280 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
1a290 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f       pIdxInfo->o
1a2a0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
1a2b0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78   0;.        pIdx
1a2c0 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26  Info->idxFlags &
1a2d0 3d 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  = ~SQLITE_INDEX_
1a2e0 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20  SCAN_UNIQUE;.   
1a2f0 20 20 20 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20       *pbIn = 1; 
1a300 61 73 73 65 72 74 28 20 28 6d 45 78 63 6c 75 64  assert( (mExclud
1a310 65 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b  e & WO_IN)==0 );
1a320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a330 20 7d 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65   }..  pNew->nLTe
1a340 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20  rm = mxTerm+1;. 
1a350 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
1a360 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53  LTerm<=pNew->nLS
1a370 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75  lot );.  pNew->u
1a380 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
1a390 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
1a3a0 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
1a3b0 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49  needFree = pIdxI
1a3c0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1a3d0 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e 66  dxStr;.  pIdxInf
1a3e0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1a3f0 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  Str = 0;.  pNew-
1a400 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d  >u.vtab.idxStr =
1a410 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
1a420 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  r;.  pNew->u.vta
1a430 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69  b.isOrdered = (i
1a440 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  8)(pIdxInfo->ord
1a450 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20  erByConsumed ?. 
1a460 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
1a470 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20  OrderBy : 0);.  
1a480 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1a490 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d  ;.  pNew->rRun =
1a4a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72   sqlite3LogEstFr
1a4b0 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66  omDouble(pIdxInf
1a4c0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1a4d0 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  );.  pNew->nOut 
1a4e0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
1a4f0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1a500 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20  tedRows);..  /* 
1a510 53 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  Set the WHERE_ON
1a520 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65  EROW flag if the
1a530 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
1a540 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20  thod indicated. 
1a550 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61   ** that the sca
1a560 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20  n will visit at 
1a570 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c  most one row. Cl
1a580 65 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65  ear it otherwise
1a590 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 49  . */.  if( pIdxI
1a5a0 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20  nfo->idxFlags & 
1a5b0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1a5c0 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  N_UNIQUE ){.    
1a5d0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
1a5e0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
1a5f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
1a600 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  ->wsFlags &= ~WH
1a610 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a  ERE_ONEROW;.  }.
1a620 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1a630 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1a640 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e   pNew);.  if( pN
1a650 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1a660 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
1a670 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e  e3_free(pNew->u.
1a680 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
1a690 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1a6a0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
1a6b0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78  .  WHERETRACE(0x
1a6c0 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25 64  ffff, ("  bIn=%d
1a6d0 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78   prereqIn=%04llx
1a6e0 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c   prereqOut=%04ll
1a6f0 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1a700 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 62 49              *pbI
1a710 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74  n, (sqlite3_uint
1a720 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20 20  64)mPrereq,.    
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36    (sqlite3_uint6
1a750 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  4)(pNew->prereq 
1a760 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a  & ~mPrereq)));..
1a770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a780 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
1a790 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1a7a0 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20   for a table of 
1a7b0 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66  the join identif
1a7c0 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64  ied by.** pBuild
1a7d0 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
1a7e0 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
1a7f0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1a800 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
1a810 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
1a820 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43  are no LEFT or C
1a830 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20  ROSS JOIN joins 
1a840 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20 62 6f  in the query, bo
1a850 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64 0a 2a  th mPrereq and.*
1a860 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72 65 20  * mUnusable are 
1a870 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72 77  set to 0. Otherw
1a880 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69 73 20  ise, mPrereq is 
1a890 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52  a mask of all FR
1a8a0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74  OM clause.** ent
1a8b0 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
1a8c0 62 65 66 6f 72 65 20 74 68 65 20 76 69 72 74 75  before the virtu
1a8d0 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  al table in the 
1a8e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20  FROM clause and 
1a8f0 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 64  are.** separated
1a900 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c   from it by at l
1a910 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72  east one LEFT or
1a920 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d   CROSS JOIN. Sim
1a930 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d  ilarly, the.** m
1a940 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f  Unusable mask co
1a950 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20  ntains all FROM 
1a960 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20 74  clause entries t
1a970 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72 20  hat occur after 
1a980 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
1a990 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65 70  able and are sep
1a9a0 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62  arated from it b
1a9b0 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c  y at least one L
1a9c0 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53  EFT or .** CROSS
1a9d0 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   JOIN. .**.** Fo
1a9e0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
1a9f0 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a  e query were:.**
1aa00 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
1aa10 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20  1, t2 LEFT JOIN 
1aa20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53 53  t3, t4, vt CROSS
1aa30 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a   JOIN t5, t6;.**
1aa40 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72 65 71  .** then mPrereq
1aa50 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1aa60 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e  (t1, t2) and mUn
1aa70 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20 74  usable to (t5, t
1aa80 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  6)..**.** All th
1aa90 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50 72 65  e tables in mPre
1aaa0 72 65 71 20 6d 75 73 74 20 62 65 20 73 63 61 6e  req must be scan
1aab0 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ned before the c
1aac0 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a  urrent virtual .
1aad0 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79  ** table. So any
1aae0 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
1aaf0 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74   all prerequisit
1ab00 65 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  es are satisfied
1ab10 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71 20   by .** mPrereq 
1ab20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69 65 64  may be specified
1ab30 20 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20   as "usable" in 
1ab40 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  all calls to xBe
1ab50 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e  stIndex. .** Con
1ab60 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62  versely, all tab
1ab70 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65  les in mUnusable
1ab80 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1ab90 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
1aba0 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  nt.** virtual ta
1abb0 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d  ble, so any term
1abc0 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
1abd0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 76  prerequisites ov
1abe0 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55  erlap with.** mU
1abf0 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61  nusable should a
1ac00 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75  lways be configu
1ac10 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62  red as "not-usab
1ac20 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64  le" for xBestInd
1ac30 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ex..*/.static in
1ac40 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
1ac50 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f  rtual(.  WhereLo
1ac60 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1ac70 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63  der,  /* WHERE c
1ac80 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
1ac90 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
1aca0 50 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20  Prereq,         
1acb0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
1acc0 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  at must be scann
1acd0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f  ed before this o
1ace0 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ne */.  Bitmask 
1acf0 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20  mUnusable       
1ad00 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
1ad10 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e  hat must be scan
1ad20 6e 65 64 20 61 66 74 65 72 20 74 68 69 73 20 6f  ned after this o
1ad30 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ne */.){.  int r
1ad40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1ad50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1ad60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72  n code */.  Wher
1ad70 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
1ad80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
1ad90 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
1ada0 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
1adb0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1adc0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1add0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1ade0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1adf0 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  C;            /*
1ae00 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1ae10 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1ae20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
1ae30 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
1ae40 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
1ae50 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69 74  earch */.  sqlit
1ae60 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1ae70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63  ;       /* Objec
1ae80 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 65  t to pass to xBe
1ae90 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 69  stIndex() */.  i
1aea0 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1aec0 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
1aed0 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20 69  ints in p */.  i
1aee0 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20 20 20  nt bIn;         
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1af00 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73  rue if plan uses
1af10 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
1af20 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
1af30 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61 73   *pNew;.  Bitmas
1af40 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20 20 20  k mBest;        
1af50 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
1af60 20 75 73 65 64 20 62 79 20 62 65 73 74 20 70 6f   used by best po
1af70 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a 0a  ssible plan */..
1af80 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65 72    assert( (mPrer
1af90 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d  eq & mUnusable)=
1afa0 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  =0 );.  pWInfo =
1afb0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
1afc0 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
1afd0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
1afe0 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
1aff0 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
1b000 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1b010 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
1b020 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
1b030 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65 72  ->iTab];.  asser
1b040 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72  t( IsVirtual(pSr
1b050 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70 20  c->pTab) );.  p 
1b060 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
1b070 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
1b080 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63   mUnusable, pSrc
1b090 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64  , pBuilder->pOrd
1b0a0 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 3d 3d  erBy);.  if( p==
1b0b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1b0c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1b0d0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
1b0e0 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
1b0f0 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
1b100 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e  LTABLE;.  pNew->
1b110 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e  nLTerm = 0;.  pN
1b120 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1b130 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e 73  ree = 0;.  nCons
1b140 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f 6e  traint = p->nCon
1b150 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77  straint;.  if( w
1b160 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70  hereLoopResize(p
1b170 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1b180 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b   nConstraint) ){
1b190 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1b1a0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
1b1b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b1c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1b1d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74  .  }..  /* First
1b1e0 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78   call xBestIndex
1b1f0 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73  () with all cons
1b200 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2e 20  traints usable. 
1b210 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  */.  WHERETRACE(
1b220 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1b230 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65  lOne: all usable
1b240 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68  \n"));.  rc = wh
1b250 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1b260 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  lOne(pBuilder, m
1b270 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c  Prereq, ALLBITS,
1b280 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 0a 20   0, p, &bIn);.. 
1b290 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20   /* If the call 
1b2a0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1b2b0 77 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65  with all terms e
1b2c0 6e 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20  nabled produced 
1b2d0 61 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74  a plan.  ** that
1b2e0 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1b2f0 65 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62  e any source tab
1b300 6c 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e  les (IOW: a plan
1b310 20 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c   with mBest==0),
1b320 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
1b330 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1b340 6d 61 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68  making any furth
1b350 65 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  er calls to xBes
1b360 74 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73  tIndex() .  ** s
1b370 69 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61  ince they will a
1b380 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ll return the sa
1b390 6d 65 20 72 65 73 75 6c 74 20 28 69 66 20 74 68  me result (if th
1b3a0 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20  e xBestIndex(). 
1b3b0 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
1b3c0 6f 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a  on is sane). */.
1b3d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b3e0 5f 4f 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20  _OK && (mBest = 
1b3f0 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20  (pNew->prereq & 
1b400 7e 6d 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b  ~mPrereq))!=0 ){
1b410 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72  .    int seenZer
1b420 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
1b430 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
1b440 70 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65  plan with no pre
1b450 72 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20  reqs seen */.   
1b460 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49   int seenZeroNoI
1b470 4e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  N = 0;         /
1b480 2a 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70  * Plan with no p
1b490 72 65 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e  rereqs and no IN
1b4a0 28 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20  (...) seen */.  
1b4b0 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20    Bitmask mPrev 
1b4c0 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  = 0;.    Bitmask
1b4d0 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a   mBestNoIn = 0;.
1b4e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
1b4f0 6c 61 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20  lan produced by 
1b500 74 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  the earlier call
1b510 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29   uses an IN(...)
1b520 20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20   term, call.    
1b530 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 61 67  ** xBestIndex ag
1b540 61 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77  ain, this time w
1b550 69 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d  ith IN(...) term
1b560 73 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20  s disabled. */. 
1b570 20 20 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20     if( bIn ){.  
1b580 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1b590 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1b5a0 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20  One: all usable 
1b5b0 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20  w/o IN\n"));.   
1b5c0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1b5d0 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70  pAddVirtualOne(p
1b5e0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1b5f0 2c 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e  , ALLBITS, WO_IN
1b600 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20  , p, &bIn);.    
1b610 20 20 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30    assert( bIn==0
1b620 20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e   );.      mBestN
1b630 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72  oIn = pNew->prer
1b640 65 71 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20  eq & ~mPrereq;. 
1b650 20 20 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f       if( mBestNo
1b660 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  In==0 ){.       
1b670 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20   seenZero = 1;. 
1b680 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e         seenZeroN
1b690 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  oIN = 1;.      }
1b6a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1b6b0 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f  all xBestIndex o
1b6c0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 64 69 73  nce for each dis
1b6d0 74 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28  tinct value of (
1b6e0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d  prereqRight & ~m
1b6f0 50 72 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20  Prereq) .    ** 
1b700 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 74 65  in the set of te
1b710 72 6d 73 20 74 68 61 74 20 61 70 70 6c 79 20 74  rms that apply t
1b720 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69  o the current vi
1b730 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  rtual table.  */
1b740 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
1b750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b760 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1b770 42 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20  Bitmask mNext = 
1b780 41 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61  ALLBITS;.      a
1b790 73 73 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29  ssert( mNext>0 )
1b7a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1b7b0 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1b7c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69  i++){.        Bi
1b7d0 74 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a  tmask mThis = (.
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 43 2d              pWC-
1b7f0 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  >a[p->aConstrain
1b800 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
1b810 5d 2e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ].prereqRight & 
1b820 7e 6d 50 72 65 72 65 71 0a 20 20 20 20 20 20 20  ~mPrereq.       
1b830 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1b840 6d 54 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d  mThis>mPrev && m
1b850 54 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65  This<mNext ) mNe
1b860 78 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20  xt = mThis;.    
1b870 20 20 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20    }.      mPrev 
1b880 3d 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69  = mNext;.      i
1b890 66 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54  f( mNext==ALLBIT
1b8a0 53 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  S ) break;.     
1b8b0 20 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73   if( mNext==mBes
1b8c0 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73  t || mNext==mBes
1b8d0 74 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65  tNoIn ) continue
1b8e0 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
1b8f0 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1b900 74 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25  tualOne: mPrev=%
1b910 30 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c  04llx mNext=%04l
1b920 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lx\n",.         
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1b940 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50  qlite3_uint64)mP
1b950 72 65 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69  rev, (sqlite3_ui
1b960 6e 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20  nt64)mNext));.  
1b970 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1b980 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1b990 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1b9a0 71 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71  q, mNext|mPrereq
1b9b0 2c 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20  , 0, p, &bIn);. 
1b9c0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70       if( pNew->p
1b9d0 72 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20 29  rereq==mPrereq )
1b9e0 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65  {.        seenZe
1b9f0 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
1ba00 69 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65  if( bIn==0 ) see
1ba10 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20  nZeroNoIN = 1;. 
1ba20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ba30 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
1ba40 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28  s to xBestIndex(
1ba50 29 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 6c  ) in the above l
1ba60 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e 64  oop did not find
1ba70 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74   a plan.    ** t
1ba80 68 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20  hat requires no 
1ba90 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74  source tables at
1baa0 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67   all (i.e. one g
1bab0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a  uaranteed to be.
1bac0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20      ** usable), 
1bad0 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72 65  make a call here
1bae0 20 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63 65   with all source
1baf0 20 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65 64   tables disabled
1bb00 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1bb10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65  SQLITE_OK && see
1bb20 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  nZero==0 ){.    
1bb30 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34    WHERETRACE(0x4
1bb40 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e  0, ("  VirtualOn
1bb50 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c  e: all disabled\
1bb60 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n"));.      rc =
1bb70 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1bb80 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72  tualOne(pBuilder
1bb90 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72  , mPrereq, mPrer
1bba0 65 71 2c 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b  eq, 0, p, &bIn);
1bbb0 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d  .      if( bIn==
1bbc0 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  0 ) seenZeroNoIN
1bbd0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1bbe0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1bbf0 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1bc00 20 68 61 76 65 20 73 6f 20 66 61 72 20 66 61 69   have so far fai
1bc10 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 6c  led to find a pl
1bc20 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  an.    ** that r
1bc30 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63  equires no sourc
1bc40 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20  e tables at all 
1bc50 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  and does not use
1bc60 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20   an IN(...).    
1bc70 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b  ** operator, mak
1bc80 65 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74  e a final call t
1bc90 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65 72  o obtain one her
1bca0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
1bcb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bcc0 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20  seenZeroNoIN==0 
1bcd0 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1bce0 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1bcf0 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69  rtualOne: all di
1bd00 73 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49  sabled and w/o I
1bd10 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  N\n"));.      rc
1bd20 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1bd30 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64  irtualOne(pBuild
1bd40 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72  er, mPrereq, mPr
1bd50 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20  ereq, WO_IN, p, 
1bd60 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  &bIn);.    }.  }
1bd70 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54  ..  if( p->needT
1bd80 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
1bd90 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64  lite3_free(p->id
1bda0 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
1bdb0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1bdc0 62 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  b, p);.  return 
1bdd0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
1bde0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1bdf0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
1be00 2a 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70  ** Add WhereLoop
1be10 20 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64   entries to hand
1be20 6c 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68  le OR terms.  Th
1be30 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74  is works for eit
1be40 68 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72  her.** btrees or
1be50 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
1be60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1be70 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20  hereLoopAddOr(. 
1be80 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
1be90 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20  r *pBuilder, .  
1bea0 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c  Bitmask mPrereq,
1beb0 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75   .  Bitmask mUnu
1bec0 73 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65  sable.){.  Where
1bed0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
1bee0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
1bef0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1bf00 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
1bf10 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54   *pNew;.  WhereT
1bf20 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43  erm *pTerm, *pWC
1bf30 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  End;.  int rc = 
1bf40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1bf50 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c   iCur;.  WhereCl
1bf60 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57  ause tempWC;.  W
1bf70 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1bf80 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65  sSubBuild;.  Whe
1bf90 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43  reOrSet sSum, sC
1bfa0 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ur;.  struct Src
1bfb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bfc0 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75  ;.  .  pWC = pBu
1bfd0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57  ilder->pWC;.  pW
1bfe0 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20  CEnd = pWC->a + 
1bff0 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e  pWC->nTerm;.  pN
1c000 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1c010 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  New;.  memset(&s
1c020 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Sum, 0, sizeof(s
1c030 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d  Sum));.  pItem =
1c040 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1c050 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
1c060 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  b;.  iCur = pIte
1c070 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66  m->iCursor;..  f
1c080 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
1c090 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26   pTerm<pWCEnd &&
1c0a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1c0b0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
1c0c0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1c0d0 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a  tor & WO_OR)!=0.
1c0e0 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
1c0f0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
1c100 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73  able & pNew->mas
1c110 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29  kSelf)!=0 .    )
1c120 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
1c130 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
1c140 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
1c150 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
1c160 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
1c170 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
1c180 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
1c190 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
1c1a0 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
1c1b0 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  .      int once 
1c1c0 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 1;.      int i
1c1d0 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  , j;.    .      
1c1e0 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75  sSubBuild = *pBu
1c1f0 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75  ilder;.      sSu
1c200 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20  bBuild.pOrderBy 
1c210 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42  = 0;.      sSubB
1c220 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73  uild.pOrSet = &s
1c230 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52  Cur;..      WHER
1c240 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1c250 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  Begin processing
1c260 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22   OR-clause %p\n"
1c270 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20  , pTerm));.     
1c280 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
1c290 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
1c2a0 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
1c2b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1c2c0 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
1c2d0 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d  ator & WO_AND)!=
1c2e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1c2f0 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
1c300 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
1c310 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
1c320 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
1c330 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
1c340 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
1c350 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20    tempWC.pWInfo 
1c360 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
1c370 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1c380 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20  pOuter = pWC;.  
1c390 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
1c3a0 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
1c3b0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
1c3c0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
1c3d0 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
1c3e0 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
1c3f0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
1c400 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20  &tempWC;.       
1c410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c420 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1c430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43      }.        sC
1c440 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66  ur.n = 0;.#ifdef
1c450 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
1c460 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52  LED.        WHER
1c470 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1c480 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70  OR-term %d of %p
1c490 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73   has %d subterms
1c4a0 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  :\n", .         
1c4b0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
1c4c0 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61  pOrTerm-pOrWC->a
1c4d0 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75  ), pTerm, sSubBu
1c4e0 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29  ild.pWC->nTerm))
1c4f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1c500 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
1c510 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
1c520 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
1c530 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73 53 75  eClausePrint(sSu
1c540 62 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20  bBuild.pWC);.   
1c550 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69       }.#endif.#i
1c560 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c570 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1c580 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
1c590 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62  tual(pItem->pTab
1c5a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
1c5b0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1c5c0 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69  Virtual(&sSubBui
1c5d0 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  ld, mPrereq, mUn
1c5e0 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  usable);.       
1c5f0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1c600 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1c610 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1c620 41 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75  AddBtree(&sSubBu
1c630 69 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  ild, mPrereq);. 
1c640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c650 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1c670 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1c680 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20  dOr(&sSubBuild, 
1c690 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62  mPrereq, mUnusab
1c6a0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  le);.        }. 
1c6b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1c6c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1c6d0 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  sCur.n==0 );.   
1c6e0 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d       if( sCur.n=
1c6f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1c700 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
1c710 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c720 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
1c730 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nce ){.         
1c740 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53   whereOrMove(&sS
1c750 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20  um, &sCur);.    
1c760 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
1c770 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c780 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72           WhereOr
1c790 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20  Set sPrev;.     
1c7a0 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
1c7b0 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b  (&sPrev, &sSum);
1c7c0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
1c7d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1c7e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65   for(i=0; i<sPre
1c7f0 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  v.n; i++){.     
1c800 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1c810 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a  j<sCur.n; j++){.
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
1c830 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75  ereOrInsert(&sSu
1c840 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72  m, sPrev.a[i].pr
1c850 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d  ereq | sCur.a[j]
1c860 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  .prereq,.       
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c880 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
1c890 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
1c8a0 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d  .rRun, sCur.a[j]
1c8b0 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20  .rRun),.        
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
1c8e0 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
1c8f0 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  nOut, sCur.a[j].
1c900 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20  nOut));.        
1c910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1c920 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1c930 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
1c940 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
1c950 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
1c960 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
1c970 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
1c980 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
1c990 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
1c9a0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
1c9b0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
1c9c0 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
1c9d0 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a  &pNew->u, 0, siz
1c9e0 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20  eof(pNew->u));. 
1c9f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
1ca00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1ca10 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  <sSum.n; i++){. 
1ca20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
1ca30 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d  : Currently sSum
1ca40 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65  .a[i].rRun is se
1ca50 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20  t to the sum of 
1ca60 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20  the costs.      
1ca70 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d    ** of all sub-
1ca80 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62  scans required b
1ca90 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48  y the OR-scan. H
1caa0 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72  owever, due to r
1cab0 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20  ounding.        
1cac0 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61  ** errors, it ma
1cad0 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f  y be that the co
1cae0 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61  st of the OR-sca
1caf0 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74  n is equal to it
1cb00 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73  s.        ** mos
1cb10 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d  t expensive sub-
1cb20 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d  scan. Add the sm
1cb30 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
1cb40 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20  penalty .       
1cb50 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20   ** (equivalent 
1cb60 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74  to multiplying t
1cb70 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29  he cost by 1.07)
1cb80 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1cb90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73  .        ** this
1cba0 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
1cbb0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  . Otherwise, for
1cbc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73   WHERE clauses s
1cbd0 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20  uch as the.     
1cbe0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
1cbf0 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61  where there is a
1cc00 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a  n index on "y":.
1cc10 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1cc20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20     **     WHERE 
1cc30 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20  likelihood(x=?, 
1cc40 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20  0.99) OR y=?.   
1cc50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1cc60 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d  ** the planner m
1cc70 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22  ay elect to "OR"
1cc80 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c   together a full
1cc90 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20  -table scan and 
1cca0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
1ccb0 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20  dex lookup. And 
1ccc0 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20  other similarly 
1ccd0 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f  odd results.  */
1cce0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
1ccf0 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Run = sSum.a[i].
1cd00 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20  rRun + 1;.      
1cd10 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
1cd20 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20  Sum.a[i].nOut;. 
1cd30 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65         pNew->pre
1cd40 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  req = sSum.a[i].
1cd50 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20  prereq;.        
1cd60 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
1cd70 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
1cd80 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
1cd90 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1cda0 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63  x200, ("End proc
1cdb0 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
1cdc0 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
1cdd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1cde0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1cdf0 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
1ce00 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
1ce10 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74  ll tables .*/.st
1ce20 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1ce30 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f  opAddAll(WhereLo
1ce40 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1ce50 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  der){.  WhereInf
1ce60 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
1ce70 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1ce80 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20  Bitmask mPrereq 
1ce90 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
1cea0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
1ceb0 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
1cec0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
1ced0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
1cee0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cef0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1cf00 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cf10 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62  em *pEnd = &pTab
1cf20 4c 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  List->a[pWInfo->
1cf30 6e 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74  nLevel];.  sqlit
1cf40 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
1cf50 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69  >pParse->db;.  i
1cf60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cf70 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  K;.  WhereLoop *
1cf80 70 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72  pNew;.  u8 prior
1cf90 4a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20  Jointype = 0;.. 
1cfa0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68   /* Loop over th
1cfb0 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1cfc0 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20  join, from left 
1cfd0 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e  to right */.  pN
1cfe0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1cff0 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  New;.  whereLoop
1d000 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f  Init(pNew);.  fo
1d010 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d  r(iTab=0, pItem=
1d020 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
1d030 65 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c  em<pEnd; iTab++,
1d040 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42   pItem++){.    B
1d050 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1d060 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
1d070 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  iTab = iTab;.   
1d080 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
1d090 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65  = sqlite3WhereGe
1d0a0 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
1d0b0 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e  MaskSet, pItem->
1d0c0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66  iCursor);.    if
1d0d0 28 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  ( ((pItem->fg.jo
1d0e0 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e  intype|priorJoin
1d0f0 74 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54  type) & (JT_LEFT
1d100 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29  |JT_CROSS))!=0 )
1d110 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1d120 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
1d130 65 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20  e when pItem is 
1d140 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1d150 74 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20  term on the.    
1d160 20 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d    ** right-hand-
1d170 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f  side of a LEFT o
1d180 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a  r CROSS JOIN.  *
1d190 2f 0a 20 20 20 20 20 20 6d 50 72 65 72 65 71 20  /.      mPrereq 
1d1a0 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  = mPrior;.    }.
1d1b0 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70      priorJointyp
1d1c0 65 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f  e = pItem->fg.jo
1d1d0 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20  intype;.    if( 
1d1e0 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
1d1f0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
1d200 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d210 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  tem *p;.      fo
1d220 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70  r(p=&pItem[1]; p
1d230 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20  <pEnd; p++){.   
1d240 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62       if( mUnusab
1d250 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69  le || (p->fg.joi
1d260 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
1d270 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20  |JT_CROSS)) ){. 
1d280 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62           mUnusab
1d290 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  le |= sqlite3Whe
1d2a0 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
1d2b0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  o->sMaskSet, p->
1d2c0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1d2d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d2e0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1d2f0 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
1d300 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  der, mPrereq, mU
1d310 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65  nusable);.    }e
1d320 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1d330 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
1d340 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  e(pBuilder, mPre
1d350 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  req);.    }.    
1d360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d370 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d380 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70  whereLoopAddOr(p
1d390 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1d3a0 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20  , mUnusable);.  
1d3b0 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c    }.    mPrior |
1d3c0 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66  = pNew->maskSelf
1d3d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
1d3e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d3f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20   ) break;.  }.. 
1d400 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
1d410 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  db, pNew);.  ret
1d420 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d430 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65   Examine a Where
1d440 50 61 74 68 20 28 77 69 74 68 20 74 68 65 20 61  Path (with the a
1d450 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ddition of the e
1d460 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  xtra WhereLoop o
1d470 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72  f the 5th.** par
1d480 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65 65 20  ameters) to see 
1d490 69 66 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f  if it outputs ro
1d4a0 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  ws in the reques
1d4b0 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  ted ORDER BY.** 
1d4c0 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 77 69  (or GROUP BY) wi
1d4d0 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20  thout requiring 
1d4e0 61 20 73 65 70 61 72 61 74 65 20 73 6f 72 74 20  a separate sort 
1d4f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75  operation.  Retu
1d500 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e  rn N:.** .**   N
1d510 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66  >0:   N terms of
1d520 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1d530 61 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69  ause are satisfi
1d540 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e  ed.**   N==0:  N
1d550 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  o terms of the O
1d560 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1d570 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
1d580 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e    N<0:   Unknown
1d590 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65   yet how many te
1d5a0 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20  rms of ORDER BY 
1d5b0 6d 69 67 68 74 20 62 65 20 73 61 74 69 73 66 69  might be satisfi
1d5c0 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ed.   .**.** Not
1d5d0 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e  e that processin
1d5e0 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55  g for WHERE_GROU
1d5f0 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49  PBY and WHERE_DI
1d600 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20  STINCTBY is not 
1d610 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57  as.** strict.  W
1d620 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64  ith GROUP BY and
1d630 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e   DISTINCT the on
1d640 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69  ly requirement i
1d650 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61  s that.** equiva
1d660 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72  lent rows appear
1d670 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a   immediately adj
1d680 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f  acent to one ano
1d690 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a  ther.  GROUP BY.
1d6a0 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  ** and DISTINCT 
1d6b0 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72  do not require r
1d6c0 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ows to appear in
1d6d0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1d6e0 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a  order as long.**
1d6f0 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72   as equivalent r
1d700 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ows are grouped 
1d710 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20  together.  Thus 
1d720 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64  for GROUP BY and
1d730 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65   DISTINCT.** the
1d740 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20   pOrderBy terms 
1d750 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69  can be matched i
1d760 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69  n any order.  Wi
1d770 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  th ORDER BY, the
1d780 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65   .** pOrderBy te
1d790 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63  rms must be matc
1d7a0 68 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65  hed in strict le
1d7b0 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65  ft-to-right orde
1d7c0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20  r..*/.static i8 
1d7d0 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
1d7e0 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  esOrderBy(.  Whe
1d7f0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
1d800 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1d810 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
1d820 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1d830 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72    /* ORDER BY or
1d840 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53   GROUP BY or DIS
1d850 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20  TINCT clause to 
1d860 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65  check */.  Where
1d870 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20  Path *pPath,    
1d880 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74   /* The WherePat
1d890 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  h to check */.  
1d8a0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
1d8b0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 5f 47        /* WHERE_G
1d8c0 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53 54 49  ROUPBY or _DISTI
1d8d0 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45 52 42  NCTBY or _ORDERB
1d8e0 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75 31 36  Y_LIMIT */.  u16
1d8f0 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20   nLoop,         
1d900 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d910 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68  entries in pPath
1d920 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57  ->aLoop[] */.  W
1d930 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c  hereLoop *pLast,
1d940 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
1d950 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68   WhereLoop to th
1d960 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e  e end of pPath->
1d970 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74  aLoop[] */.  Bit
1d980 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20  mask *pRevMask  
1d990 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
1d9a0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f  of WhereLoops to
1d9b0 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20   run in reverse 
1d9c0 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38  order */.){.  u8
1d9d0 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20   revSet;        
1d9e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1d9f0 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20  ev is known */. 
1da00 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20   u8 rev;        
1da10 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73         /* Compos
1da20 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  ite sort order *
1da30 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20  /.  u8 revIdx;  
1da40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1da50 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  ex sort order */
1da60 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73  .  u8 isOrderDis
1da70 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20  tinct;   /* All 
1da80 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73  prior WhereLoops
1da90 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69   are order-disti
1daa0 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74  nct */.  u8 dist
1dab0 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f  inctColumns;   /
1dac0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f  * True if the lo
1dad0 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f  op has UNIQUE NO
1dae0 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a  T NULL columns *
1daf0 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20  /.  u8 isMatch; 
1db00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f            /* iCo
1db10 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74  lumn matches a t
1db20 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
1db30 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1db40 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20 20 20  u16 eqOpMask;   
1db50 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64        /* Allowed
1db60 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
1db70 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65  ors */.  u16 nKe
1db80 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  yCol;          /
1db90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
1dba0 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65  columns in pInde
1dbb0 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75  x */.  u16 nColu
1dbc0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
1dbd0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1dbe0 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20  ordered columns 
1dbf0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
1dc00 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
1dc10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dc20 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
1dc30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1dc40 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
1dc50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1dc60 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
1dc70 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
1dc80 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
1dc90 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
1dca0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1dcb0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
1dcc0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
1dcd0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
1dce0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
1dcf0 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
1dd00 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
1dd10 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
1dd20 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
1dd30 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
1dd40 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
1dd50 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
1dd60 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
1dd70 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
1dd80 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
1dd90 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
1dda0 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1ddb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1ddc0 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
1ddd0 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
1dde0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
1ddf0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1de00 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1de10 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
1de20 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
1de30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1de40 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
1de50 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
1de60 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1de70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1de80 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
1de90 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
1dea0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
1deb0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1dec0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
1ded0 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
1dee0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
1def0 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
1df00 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
1df10 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
1df20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1df30 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
1df40 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
1df50 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
1df60 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
1df70 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
1df80 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
1df90 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
1dfa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1dfb0 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
1dfc0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
1dfd0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
1dfe0 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
1dff0 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
1e000 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
1e010 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
1e020 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
1e030 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
1e040 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1e050 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
1e060 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
1e070 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
1e080 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
1e090 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
1e0a0 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
1e0b0 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
1e0c0 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
1e0d0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
1e0e0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
1e0f0 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
1e100 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
1e110 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
1e120 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
1e130 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
1e140 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
1e150 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
1e160 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
1e170 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
1e180 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
1e190 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
1e1a0 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
1e1b0 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
1e1c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1e1d0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
1e1e0 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
1e1f0 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
1e200 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
1e210 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
1e220 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
1e230 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
1e240 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
1e250 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
1e260 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
1e270 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
1e280 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
1e290 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
1e2a0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
1e2b0 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
1e2c0 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
1e2d0 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
1e2e0 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
1e2f0 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
1e300 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
1e310 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
1e320 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
1e330 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
1e340 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
1e350 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
1e360 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
1e370 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
1e380 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
1e390 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
1e3a0 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
1e3b0 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
1e3c0 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
1e3d0 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
1e3e0 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
1e3f0 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
1e400 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
1e410 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1e420 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
1e430 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
1e440 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
1e450 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
1e460 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
1e470 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
1e480 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26  );.  if( nLoop &
1e490 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
1e4a0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
1e4b0 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
1e4c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
1e4d0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
1e4e0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
1e4f0 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
1e500 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
1e510 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
1e520 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
1e530 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
1e540 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
1e550 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
1e560 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
1e570 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
1e580 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
1e590 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
1e5a0 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
1e5b0 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70 4d 61  dy = 0;.  eqOpMa
1e5c0 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57 4f 5f  sk = WO_EQ | WO_
1e5d0 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  IS | WO_ISNULL;.
1e5e0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
1e5f0 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
1e600 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d 61 73  _LIMIT ) eqOpMas
1e610 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20 66 6f  k |= WO_IN;.  fo
1e620 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f 72 64  r(iLoop=0; isOrd
1e630 65 72 44 69 73 74 69 6e 63 74 20 26 26 20 6f 62  erDistinct && ob
1e640 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20 69 4c  Sat<obDone && iL
1e650 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f  oop<=nLoop; iLoo
1e660 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  p++){.    if( iL
1e670 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20 7c 3d  oop>0 ) ready |=
1e680 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
1e690 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3c  ;.    if( iLoop<
1e6a0 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 70  nLoop ){.      p
1e6b0 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e 61 4c  Loop = pPath->aL
1e6c0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
1e6d0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
1e6e0 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
1e6f0 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69 6e 75  _LIMIT ) continu
1e700 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
1e710 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 61 73      pLoop = pLas
1e720 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1e730 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1e740 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1e750 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ABLE ){.      if
1e760 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  ( pLoop->u.vtab.
1e770 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62 53 61  isOrdered ) obSa
1e780 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20 20 20  t = obDone;.    
1e790 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e7a0 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f     iCur = pWInfo
1e7b0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1e7c0 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73  oop->iTab].iCurs
1e7d0 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  or;..    /* Mark
1e7e0 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42   off any ORDER B
1e7f0 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73  Y term X that is
1e800 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1e810 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a   table of.    **
1e820 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
1e830 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  p for which ther
1e840 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65  e is term in the
1e850 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c   WHERE.    ** cl
1e860 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  ause of the form
1e870 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d   X IS NULL or X=
1e880 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  ? that reference
1e890 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20   only outer.    
1e8a0 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f  ** loops..    */
1e8b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e8c0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
1e8d0 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
1e8e0 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
1e8f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1e900 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  OBExpr = sqlite3
1e910 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1e920 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1e930 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
1e940 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b   pOBExpr->op!=TK
1e950 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e  _COLUMN ) contin
1e960 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ue;.      if( pO
1e970 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69  BExpr->iTable!=i
1e980 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
1e990 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71        pTerm = sq
1e9a0 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65  lite3WhereFindTe
1e9b0 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  rm(&pWInfo->sWC,
1e9c0 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e   iCur, pOBExpr->
1e9d0 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 7e 72 65 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b  ~ready, eqOpMask
1ea00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1ea10 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69  pTerm==0 ) conti
1ea20 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
1ea30 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1ea40 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21  &(WO_EQ|WO_IS))!
1ea50 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e 69  =0 && pOBExpr->i
1ea60 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
1ea70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ea80 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20 20  *z1, *z2;.      
1ea90 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1eaa0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
1eab0 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
1eac0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1ead0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1eae0 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1eaf0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
1eb00 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43 6f          z1 = pCo
1eb10 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
1eb20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1eb30 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
1eb40 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 54  Info->pParse, pT
1eb50 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  erm->pExpr);.   
1eb60 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1eb70 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
1eb80 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
1eb90 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z2 = pColl->zNa
1eba0 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
1ebb0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1ebc0 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e 74  1, z2)!=0 ) cont
1ebd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 74 65  inue;.        te
1ebe0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70  stcase( pTerm->p
1ebf0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1ec00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ec10 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
1ec20 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  T(i);.    }..   
1ec30 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1ec40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
1ec50 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ROW)==0 ){.     
1ec60 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1ec70 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 20  ags & WHERE_IPK 
1ec80 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1ec90 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  x = 0;.        n
1eca0 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  KeyCol = 0;.    
1ecb0 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b      nColumn = 1;
1ecc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ecd0 20 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70   (pIndex = pLoop
1ece0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1ecf0 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  )==0 || pIndex->
1ed00 62 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20  bUnordered ){.  
1ed10 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1ed20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ed30 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70       nKeyCol = p
1ed40 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  Index->nKeyCol;.
1ed50 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20          nColumn 
1ed60 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  = pIndex->nColum
1ed70 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
1ed80 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79  t( nColumn==nKey
1ed90 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77  Col+1 || !HasRow
1eda0 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
1edb0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  e) );.        as
1edc0 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 61 69  sert( pIndex->ai
1edd0 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31  Column[nColumn-1
1ede0 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20 20 20 20  ]==XN_ROWID.    
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77        || !HasRow
1ee10 69 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  id(pIndex->pTabl
1ee20 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  e));.        isO
1ee30 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49  rderDistinct = I
1ee40 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
1ee50 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
1ee60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
1ee70 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  ough all columns
1ee80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
1ee90 64 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  d deal with the 
1eea0 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ones.      ** th
1eeb0 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74  at are not const
1eec0 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20  rained by == or 
1eed0 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
1eee0 20 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20     rev = revSet 
1eef0 3d 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69  = 0;.      disti
1ef00 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a  nctColumns = 0;.
1ef10 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1ef20 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  <nColumn; j++){.
1ef30 20 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65          u8 bOnce
1ef40 3b 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72  ;   /* True to r
1ef50 75 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  un the ORDER BY 
1ef60 73 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a  search loop */..
1ef70 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
1ef80 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61  over == and IS a
1ef90 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e  nd ISNULL terms.
1efa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 41 6c 73  .        ** (Als
1efb0 6f 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20  o skip IN terms 
1efc0 77 68 65 6e 20 64 6f 69 6e 67 20 57 48 45 52 45  when doing WHERE
1efd0 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 70  _ORDERBY_LIMIT p
1efe0 72 6f 63 65 73 73 69 6e 67 29 0a 20 20 20 20 20  rocessing).     
1eff0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1f000 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
1f010 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
1f020 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d  && pLoop->nSkip=
1f030 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
1f040 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  (i = pLoop->aLTe
1f050 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72  rm[j]->eOperator
1f060 29 20 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30  ) & eqOpMask)!=0
1f070 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1f080 20 20 20 20 20 20 69 66 28 20 69 20 26 20 57 4f        if( i & WO
1f090 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1f0a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f0b0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1f0c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1f0d0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1f0e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1f0f0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1f100 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 7d  nue;  .        }
1f110 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ..        /* Get
1f120 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1f130 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  er in the table 
1f140 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f  (iColumn) and so
1f150 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  rt order.       
1f160 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66 6f 72   ** (revIdx) for
1f170 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e   the j-th column
1f180 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   of the index.. 
1f190 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f1a0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1f1b0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d            iColum
1f1c0 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
1f1d0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1f1e0 20 20 20 72 65 76 49 64 78 20 3d 20 70 49 6e 64     revIdx = pInd
1f1f0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  ex->aSortOrder[j
1f200 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1f210 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78   iColumn==pIndex
1f220 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
1f230 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ) iColumn = -1;.
1f240 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f250 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e           iColumn
1f260 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1f270 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
1f280 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1f290 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
1f2a0 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
1f2b0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
1f2c0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
1f2d0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
1f2e0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
1f2f0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
1f300 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f310 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
1f320 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
1f330 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
1f340 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
1f350 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
1f360 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
1f370 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
1f380 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
1f390 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
1f3a0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
1f3b0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
1f3c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1f3d0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
1f3e0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
1f3f0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1f400 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
1f410 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
1f420 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
1f430 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
1f440 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
1f450 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
1f460 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
1f470 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
1f480 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
1f490 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
1f4a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1f4b0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
1f4c0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
1f4d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
1f4e0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1f4f0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
1f500 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
1f510 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
1f520 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
1f530 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
1f540 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
1f550 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
1f560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
1f570 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
1f580 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
1f590 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
1f5a0 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
1f5b0 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
1f5c0 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
1f5d0 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
1f5e0 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
1f5f0 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
1f600 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1f610 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f620 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
1f630 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
1f640 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f650 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
1f660 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
1f670 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
1f680 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
1f690 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f6a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1f6b0 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72 2c 70  ompare(pOBExpr,p
1f6c0 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
1f6d0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  >a[j].pExpr,iCur
1f6e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1f6f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1f700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f720 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20   if( iColumn>=0 
1f730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1f740 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1f750 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f  prCollSeq(pWInfo
1f760 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  ->pParse, pOrder
1f770 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
1f780 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f790 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
1f7a0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
1f7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f7c0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1f7d0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
1f7e0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  ndex->azColl[j])
1f7f0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
1f800 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f810 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
1f820 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
1f830 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1f840 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63        if( isMatc
1f850 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73  h && (wctrlFlags
1f860 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
1f870 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f880 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1f890 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
1f8a0 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
1f8b0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1f8c0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
1f8d0 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72  Sort order is ir
1f8e0 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47  relevant for a G
1f8f0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1f900 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1f910 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20   revSet ){.     
1f920 20 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20         if( (rev 
1f930 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65  ^ revIdx)!=pOrde
1f940 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
1f950 64 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20  der ) isMatch = 
1f960 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1f970 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f980 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70  rev = revIdx ^ p
1f990 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
1f9a0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20  rtOrder;.       
1f9b0 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
1f9c0 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
1f9d0 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
1f9e0 20 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d          revSet =
1f9f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
1fa00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fa10 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
1fa20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1fa30 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1fa40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fa50 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
1fa60 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
1fa70 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
1fa80 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
1fa90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
1faa0 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
1fab0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i);.        }els
1fac0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1fad0 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a  No match found *
1fae0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1faf0 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f  j==0 || j<nKeyCo
1fb00 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
1fb10 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
1fb20 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b  erDistinct!=0 );
1fb30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
1fb40 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1fb50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1fb60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fb70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1fb80 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65   /* end Loop ove
1fb90 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  r all index colu
1fba0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  mns */.      if(
1fbb0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
1fbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1fbd0 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73  case( isOrderDis
1fbe0 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
1fbf0 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
1fc00 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nct = 1;.      }
1fc10 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66  .    } /* end-if
1fc20 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a   not one-row */.
1fc30 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66  .    /* Mark off
1fc40 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52   any other ORDER
1fc50 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72   BY terms that r
1fc60 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a  eference pLoop *
1fc70 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65  /.    if( isOrde
1fc80 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  rDistinct ){.   
1fc90 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74     orderDistinct
1fca0 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d  Mask |= pLoop->m
1fcb0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66  askSelf;.      f
1fcc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
1fcd0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
1fce0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20    Expr *p;.     
1fcf0 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d     Bitmask mTerm
1fd00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41  ;.        if( MA
1fd10 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74  SKBIT(i) & obSat
1fd20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fd30 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42       p = pOrderB
1fd40 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
1fd50 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 73         mTerm = s
1fd60 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55  qlite3WhereExprU
1fd70 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  sage(&pWInfo->sM
1fd80 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20 20 20  askSet,p);.     
1fd90 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d 30 20     if( mTerm==0 
1fda0 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
1fdb0 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29 20 63  sConstant(p) ) c
1fdc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1fdd0 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f 72 64   if( (mTerm&~ord
1fde0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 29 3d  erDistinctMask)=
1fdf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1fe00 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54  obSat |= MASKBIT
1fe10 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1fe20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1fe30 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f 6f 70   /* End the loop
1fe40 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72 65 4c   over all WhereL
1fe50 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65 72 2d  oops from outer-
1fe60 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69 6e 6e  most down to inn
1fe70 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69 66 28  er-most */.  if(
1fe80 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65 20 29   obSat==obDone )
1fe90 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f 72 64   return (i8)nOrd
1fea0 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69 73 4f  erBy;.  if( !isO
1feb0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
1fec0 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64 65 72      for(i=nOrder
1fed0 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  By-1; i>0; i--){
1fee0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1fef0 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20 2d 20   = MASKBIT(i) - 
1ff00 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62  1;.      if( (ob
1ff10 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65 74 75  Sat&m)==m ) retu
1ff20 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn i;.    }.    
1ff30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ff40 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f  return -1;.}.../
1ff50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
1ff60 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69  E_GROUPBY flag i
1ff70 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d 61 73  s set in the mas
1ff80 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  k passed to sqli
1ff90 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
1ffa0 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20  .** the planner 
1ffb0 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1ffc0 20 73 70 65 63 69 66 69 65 64 20 70 4f 72 64 65   specified pOrde
1ffd0 72 42 79 20 6c 69 73 74 20 69 73 20 61 63 74 75  rBy list is actu
1ffe0 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a 2a 20  ally a GROUP.** 
1fff0 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e 64 20  BY clause - and 
20000 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74 68 61  so any order tha
20010 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20 61 73  t groups rows as
20020 20 72 65 71 75 69 72 65 64 20 73 61 74 69 73 66   required satisf
20030 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  ies the.** reque
20040 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  st..**.** Normal
20050 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ly, in this case
20060 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
20070 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61 6c 6c  ble for the call
20080 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  er to determine.
20090 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
200a0 74 20 74 68 65 20 72 6f 77 73 20 61 72 65 20 72  t the rows are r
200b0 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65 6c 69  eally being deli
200c0 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65 64 20  vered in sorted 
200d0 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73  order, or.** jus
200e0 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  t in some other 
200f0 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f 76 69  order that provi
20100 64 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64  des the required
20110 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77 65 76   grouping. Howev
20120 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  er,.** if the WH
20130 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
20140 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70 61 73  flag is also pas
20150 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
20160 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68 65 6e  ereBegin(), then
20170 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
20180 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
20190 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
201a0 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65 63 74  WhereInfo object
201b0 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20  . It returns.** 
201c0 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 73  true if the rows
201d0 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62 65 20   really will be 
201e0 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20 73 70  sorted in the sp
201f0 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c 20 6f  ecified order, o
20200 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72  r false.** other
20210 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  wise..**.** For 
20220 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
20230 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
20240 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
20250 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68  (x, Y);.**.** th
20260 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  en.**.**   SELEC
20270 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
20280 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52 20 42  P BY x,y ORDER B
20290 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73 53 6f  Y x,y;   -- IsSo
202a0 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20 20 53  rted()==1.**   S
202b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
202c0 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f 52 44  GROUP BY y,x ORD
202d0 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d 2d 20  ER BY y,x;   -- 
202e0 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a 2a 2f  IsSorted()==0.*/
202f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
20300 65 49 73 53 6f 72 74 65 64 28 57 68 65 72 65 49  eIsSorted(WhereI
20310 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
20320 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
20330 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
20340 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a 20 20  RE_GROUPBY );.  
20350 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
20360 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
20370 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 29  RE_SORTBYGROUP )
20380 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  ;.  return pWInf
20390 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69  o->sorted;.}..#i
203a0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
203b0 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72 20 64  ENABLED./* For d
203c0 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
203d0 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y: */.static con
203e0 73 74 20 63 68 61 72 20 2a 77 68 65 72 65 50 61  st char *wherePa
203f0 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61 74 68  thName(WherePath
20400 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e 4c 6f   *pPath, int nLo
20410 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  op, WhereLoop *p
20420 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69 63 20  Last){.  static 
20430 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a  char zName[65];.
20440 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
20450 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b  =0; i<nLoop; i++
20460 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 70 50  ){ zName[i] = pP
20470 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63  ath->aLoop[i]->c
20480 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c 61 73  Id; }.  if( pLas
20490 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d  t ) zName[i++] =
204a0 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20 20 7a   pLast->cId;.  z
204b0 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  Name[i] = 0;.  r
204c0 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
204d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
204e0 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
204f0 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72 6f 77  sorting nRow row
20500 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
20510 20 74 68 65 20 6b 65 79 73 20 68 61 76 65 20 0a   the keys have .
20520 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f 6c 75  ** nOrderby colu
20530 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74 68 65  mns and that the
20540 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64 20 63   first nSorted c
20550 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72 65 61  olumns are alrea
20560 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a  dy in.** order..
20570 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
20580 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73   whereSortingCos
20590 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
205a0 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45 73 74  pWInfo,.  LogEst
205b0 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e 4f 72   nRow,.  int nOr
205c0 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e 53 6f  derBy,.  int nSo
205d0 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e  rted.){.  /* TUN
205e0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
205f0 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 65 78  ost of a full ex
20600 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77 68 65  ternal sort, whe
20610 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20 74 68  re N is .  ** th
20620 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
20630 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20 20 2a   to sort is:.  *
20640 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20  *.  **   cost = 
20650 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e  (3.0 * N * log(N
20660 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  ))..  ** .  ** O
20670 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65 72 2d  r, if the order-
20680 62 79 20 63 6c 61 75 73 65 20 68 61 73 20 58 20  by clause has X 
20690 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79 20 74  terms but only t
206a0 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a 2a 20  he last Y .  ** 
206b0 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20 6f 66  terms are out of
206c0 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62 6c 6f   order, then blo
206d0 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c 6c 20  ck-sorting will 
206e0 72 65 64 75 63 65 20 74 68 65 20 0a 20 20 2a 2a  reduce the .  **
206f0 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20 74 6f   sorting cost to
20700 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
20710 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
20720 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58 29 0a  log(N)) * (Y/X).
20730 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 28 59    **.  ** The (Y
20740 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d 70 6c  /X) term is impl
20750 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 73 74  emented using st
20760 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72 53 63  ack variable rSc
20770 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77 2e 20  ale.  ** below. 
20780 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 63   */.  LogEst rSc
20790 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74 3b 0a  ale, rSortCost;.
207a0 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
207b0 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71 6c 69  By>0 && 66==sqli
207c0 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
207d0 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73 71 6c  ;.  rScale = sql
207e0 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f 72 64  ite3LogEst((nOrd
207f0 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a 31 30  erBy-nSorted)*10
20800 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20 36 36  0/nOrderBy) - 66
20810 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20  ;.  rSortCost = 
20820 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20 2b 20  nRow + rScale + 
20830 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74 69 70  16;..  /* Multip
20840 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77 68 65  le by log(M) whe
20850 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75 6d 62  re M is the numb
20860 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
20870 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
20880 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66 20 69  LIMIT for M if i
20890 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a  t is smaller */.
208a0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
208b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
208c0 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d 30 20  E_USE_LIMIT)!=0 
208d0 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69  && pWInfo->iLimi
208e0 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 6e 52  t<nRow ){.    nR
208f0 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  ow = pWInfo->iLi
20900 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f 72 74  mit;.  }.  rSort
20910 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 6e  Cost += estLog(n
20920 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Row);.  return r
20930 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a  SortCost;.}../*.
20940 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73  ** Given the lis
20950 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f  t of WhereLoop o
20960 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f  bjects at pWInfo
20970 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72  ->pLoops, this r
20980 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70  outine.** attemp
20990 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c  ts to find the l
209a0 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
209b0 74 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68  that visits each
209c0 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e   WhereLoop.** on
209d0 63 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69  ce.  This path i
209e0 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e  s then loaded in
209f0 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61  to the pWInfo->a
20a00 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73  [].pWLoop fields
20a10 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74  ..**.** Assume t
20a20 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  hat the total nu
20a30 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
20a40 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  ows that will ne
20a50 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a  ed to be sorted.
20a60 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45  ** will be nRowE
20a70 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f  st (in the 10*lo
20a80 67 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  g2 representatio
20a90 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20  n).  Or, ignore 
20aa0 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73  sorting.** costs
20ab0 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a   if nRowEst==0..
20ac0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
20ad0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
20ae0 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  s or SQLITE_NOME
20af0 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M of a memory al
20b00 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f  location.** erro
20b10 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
20b20 74 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74  tic int wherePat
20b30 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66  hSolver(WhereInf
20b40 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73  o *pWInfo, LogEs
20b50 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e  t nRowEst){.  in
20b60 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20  t mxChoice;     
20b70 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
20b80 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  um number of sim
20b90 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20  ultaneous paths 
20ba0 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  tracked */.  int
20bb0 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   nLoop;         
20bc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20bd0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
20be0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65   join */.  Parse
20bf0 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
20c00 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
20c10 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
20c20 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
20c30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
20c40 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20c50 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  n */.  int iLoop
20c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c70 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20c80 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20   over the terms 
20c90 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
20ca0 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20   int ii, jj;    
20cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20cc0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
20cd0 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20   int mxI = 0;   
20ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20cf0 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72  dex of next entr
20d00 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a  y to replace */.
20d10 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
20d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20d30 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
20d40 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a  Y clause terms *
20d50 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73  /.  LogEst mxCos
20d60 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
20d70 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66   Maximum cost of
20d80 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20   a set of paths 
20d90 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e  */.  LogEst mxUn
20da0 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f  sorted = 0;    /
20db0 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74  * Maximum unsort
20dc0 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  ed cost of a set
20dd0 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e   of path */.  in
20de0 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20  t nTo, nFrom;   
20df0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20e00 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69  r of valid entri
20e10 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20  es in aTo[] and 
20e20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65  aFrom[] */.  Whe
20e30 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20  rePath *aFrom;  
20e40 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46         /* All nF
20e50 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65  rom paths at the
20e60 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20   previous level 
20e70 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
20e80 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  aTo;           /
20e90 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70  * The nTo best p
20ea0 61 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72  aths at the curr
20eb0 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ent level */.  W
20ec0 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b  herePath *pFrom;
20ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
20ee0 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b  lement of aFrom[
20ef0 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f  ] that we are wo
20f00 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68  rking on */.  Wh
20f10 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20  erePath *pTo;   
20f20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
20f30 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74  ement of aTo[] t
20f40 68 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69  hat we are worki
20f50 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ng on */.  Where
20f60 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20  Loop *pWLoop;   
20f70 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
20f80 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
20f90 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c  ects */.  WhereL
20fa0 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20  oop **pX;       
20fb0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64      /* Used to d
20fc0 69 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63  ivy up the pSpac
20fd0 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f  e memory */.  Lo
20fe0 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20  gEst *aSortCost 
20ff0 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69  = 0;    /* Sorti
21000 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73  ng and partial s
21010 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a  orting costs */.
21020 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20    char *pSpace; 
21030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21040 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
21050 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  used by this rou
21060 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tine */.  int nS
21070 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
21080 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
21090 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
210a0 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20  at pSpace */..  
210b0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
210c0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
210d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c  pParse->db;.  nL
210e0 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  oop = pWInfo->nL
210f0 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e  evel;.  /* TUNIN
21100 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75  G: For simple qu
21110 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  eries, only the 
21120 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61  best path is tra
21130 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32  cked..  ** For 2
21140 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20  -way joins, the 
21150 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65  5 best paths are
21160 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20   followed..  ** 
21170 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f  For joins of 3 o
21180 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74  r more tables, t
21190 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74  rack the 10 best
211a0 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68   paths */.  mxCh
211b0 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31  oice = (nLoop<=1
211c0 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d  ) ? 1 : (nLoop==
211d0 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61  2 ? 5 : 10);.  a
211e0 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57  ssert( nLoop<=pW
211f0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
21200 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54  nSrc );.  WHERET
21210 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d  RACE(0x002, ("--
21220 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e  -- begin solver.
21230 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e    (nRowEst=%d)\n
21240 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20  ", nRowEst));.. 
21250 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69   /* If nRowEst i
21260 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65  s zero and there
21270 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
21280 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69  clause, ignore i
21290 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20  t. In this.  ** 
212a0 63 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65  case the purpose
212b0 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   of this call is
212c0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
212d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
212e0 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79  returned.  ** by
212f0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65   the overall que
21300 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73  ry. Once this es
21310 74 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20  timate has been 
21320 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61  obtained, the ca
21330 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69  ller.  ** will i
21340 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74  nvoke this funct
21350 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ion a second tim
21360 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65  e, passing the e
21370 73 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20  stimate as the. 
21380 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61   ** nRowEst para
21390 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28  meter.  */.  if(
213a0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
213b0 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d  y==0 || nRowEst=
213c0 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72  =0 ){.    nOrder
213d0 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  By = 0;.  }else{
213e0 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  .    nOrderBy = 
213f0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
21400 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20  ->nExpr;.  }..  
21410 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
21420 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65  initialize space
21430 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20   for aTo, aFrom 
21440 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20  and aSortCost[] 
21450 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73  */.  nSpace = (s
21460 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29  izeof(WherePath)
21470 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f  +sizeof(WhereLoo
21480 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f  p*)*nLoop)*mxCho
21490 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20  ice*2;.  nSpace 
214a0 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
214b0 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ) * nOrderBy;.  
214c0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
214d0 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
214e0 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28  , nSpace);.  if(
214f0 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74   pSpace==0 ) ret
21500 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21510 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d 20 28  _BKPT;.  aTo = (
21520 57 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63  WherePath*)pSpac
21530 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f  e;.  aFrom = aTo
21540 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d  +mxChoice;.  mem
21550 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69  set(aFrom, 0, si
21560 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b  zeof(aFrom[0]));
21570 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f  .  pX = (WhereLo
21580 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68  op**)(aFrom+mxCh
21590 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  oice);.  for(ii=
215a0 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f  mxChoice*2, pFro
215b0 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d  m=aTo; ii>0; ii-
215c0 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b  -, pFrom++, pX +
215d0 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46  = nLoop){.    pF
215e0 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b  rom->aLoop = pX;
215f0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65  .  }.  if( nOrde
21600 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
21610 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
21620 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
21630 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67   it is not being
21640 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70   ignored, set up
21650 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  .    ** space fo
21660 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b  r the aSortCost[
21670 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c  ] array. Each el
21680 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f  ement of the aSo
21690 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20  rtCost array.   
216a0 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65   ** is either ze
216b0 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20  ro - meaning it 
216c0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
216d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f   initialized - o
216e0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  r the.    ** cos
216f0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
21700 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74  wEst rows of dat
21710 61 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  a where the firs
21720 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20  t X terms of.   
21730 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
21740 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65   clause are alre
21750 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68  ady in order, wh
21760 65 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72  ere X is the arr
21770 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ay .    ** index
21780 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43  .  */.    aSortC
21790 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  ost = (LogEst*)p
217a0 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53  X;.    memset(aS
217b0 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  ortCost, 0, size
217c0 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72  of(LogEst) * nOr
217d0 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73  derBy);.  }.  as
217e0 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d  sert( aSortCost=
217f0 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
21800 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61  pace]==(char*)&a
21810 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42  SortCost[nOrderB
21820 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y] );.  assert( 
21830 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20  aSortCost!=0 || 
21840 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
21850 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20  =(char*)pX );.. 
21860 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61   /* Seed the sea
21870 72 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c  rch with a singl
21880 65 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74  e WherePath cont
21890 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72  aining zero Wher
218a0 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  eLoops..  **.  *
218b0 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74  * TUNING: Do not
218c0 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   let the number 
218d0 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f  of iterations go
218e0 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74   above 28.  If t
218f0 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20  he cost.  ** of 
21900 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74  computing an aut
21910 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20  omatic index is 
21920 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69  not paid back wi
21930 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32  thin the first 2
21940 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65  8.  ** rows, the
21950 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  n do not use the
21960 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
21970 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e  . */.  aFrom[0].
21980 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73  nRow = MIN(pPars
21990 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34  e->nQueryLoop, 4
219a0 38 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d  8);  assert( 48=
219b0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
219c0 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20  8) );.  nFrom = 
219d0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72  1;.  assert( aFr
219e0 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d  om[0].isOrdered=
219f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  =0 );.  if( nOrd
21a00 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49  erBy ){.    /* I
21a10 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c  f nLoop is zero,
21a20 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
21a30 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e  no FROM terms in
21a40 20 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63   the query. Sinc
21a50 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  e.    ** in this
21a60 20 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20   case the query 
21a70 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78  may return a max
21a80 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c  imum of one row,
21a90 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
21aa0 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
21ab0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
21ac0 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72   order. Set isOr
21ad0 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42  dered to nOrderB
21ae0 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69  y to.    ** indi
21af0 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69  cate this. Or, i
21b00 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74  f nLoop is great
21b10 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65  er than zero, se
21b20 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20  t isOrdered to. 
21b30 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61     ** -1, indica
21b40 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ting that the re
21b50 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20  sult set may or 
21b60 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72  may not be order
21b70 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65  ed, .    ** depe
21b80 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f  nding on the loo
21b90 70 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ps added to the 
21ba0 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a  current plan.  *
21bb0 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69  /.    aFrom[0].i
21bc0 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70  sOrdered = nLoop
21bd0 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72  >0 ? -1 : nOrder
21be0 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  By;.  }..  /* Co
21bf0 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
21c00 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
21c10 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
21c20 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
21c30 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
21c40 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
21c50 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
21c60 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
21c70 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
21c80 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
21c90 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
21ca0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
21cb0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
21cc0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
21cd0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
21ce0 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
21cf0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
21d00 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
21d10 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
21d20 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
21d30 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
21d40 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
21d50 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f         LogEst nO
21d60 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
21d70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
21d80 20 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72   visited by (pFr
21d90 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
21da0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f        LogEst rCo
21db0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
21dc0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
21dd0 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70  of path (pFrom+p
21de0 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
21df0 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74    LogEst rUnsort
21e00 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
21e10 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20      /* Unsorted 
21e20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70  cost of (pFrom+p
21e30 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20  WLoop) */.      
21e40 20 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d    i8 isOrdered =
21e50 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
21e60 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64  d;  /* isOrdered
21e70 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f   for (pFrom+pWLo
21e80 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  op) */.        B
21e90 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20  itmask maskNew; 
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20   /* Mask of src 
21ec0 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20  visited by (..) 
21ed0 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  */.        Bitma
21ee0 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20  sk revMask = 0; 
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f00 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65  Mask of rev-orde
21f10 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29  r loops for (..)
21f20 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28   */..        if(
21f30 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   (pWLoop->prereq
21f40 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c   & ~pFrom->maskL
21f50 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
21f60 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
21f70 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  (pWLoop->maskSel
21f80 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c  f & pFrom->maskL
21f90 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  oop)!=0 ) contin
21fa0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
21fb0 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  (pWLoop->wsFlags
21fc0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
21fd0 44 45 58 29 21 3d 30 20 26 26 20 70 46 72 6f 6d  DEX)!=0 && pFrom
21fe0 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a 20 20 20  ->nRow<10 ){.   
21ff0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
22000 20 75 73 65 20 61 6e 20 61 75 74 6f 6d 61 74 69   use an automati
22010 63 20 69 6e 64 65 78 20 69 66 20 74 68 65 20 74  c index if the t
22020 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 78 70 65  his loop is expe
22030 63 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  cted.          *
22040 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73 20 74 68  * to run less th
22050 61 6e 20 32 20 74 69 6d 65 73 2e 20 2a 2f 0a 20  an 2 times. */. 
22060 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22070 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
22080 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20  st(2) );.       
22090 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
220a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
220b0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
220c0 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63 61 6e   pWLoop is a can
220d0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 68 65  didate to be the
220e0 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20 20 20   next loop. .   
220f0 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20       ** Compute 
22100 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  its cost */.    
22110 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d 20      rUnsorted = 
22120 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
22130 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
22140 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
22150 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
22160 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20 3d       rUnsorted =
22170 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
22180 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70 46 72  d(rUnsorted, pFr
22190 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29 3b 0a  om->rUnsorted);.
221a0 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 70          nOut = p
221b0 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
221c0 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
221d0 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70 46 72     maskNew = pFr
221e0 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
221f0 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
22200 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
22210 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20 20 20  rdered<0 ){.    
22220 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 20        isOrdered 
22230 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
22240 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
22250 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
22260 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
22270 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
22280 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  om, pWInfo->wctr
22290 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  lFlags,.        
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
222b0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20 26 72  Loop, pWLoop, &r
222c0 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  evMask);.       
222d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
222e0 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f    revMask = pFro
222f0 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20  m->revLoop;.    
22300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22310 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 26  ( isOrdered>=0 &
22320 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f 72 64  & isOrdered<nOrd
22330 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
22340 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73 74 5b    if( aSortCost[
22350 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20 29 7b  isOrdered]==0 ){
22360 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f  .            aSo
22370 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64  rtCost[isOrdered
22380 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69 6e 67  ] = whereSorting
22390 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Cost(.          
223a0 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20 6e 52        pWInfo, nR
223b0 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  owEst, nOrderBy,
223c0 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20   isOrdered.     
223d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
223e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
223f0 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  rCost = sqlite3L
22400 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74  ogEstAdd(rUnsort
22410 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b 69 73  ed, aSortCost[is
22420 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20 20 20  Ordered]);..    
22430 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
22440 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20 20 20  (0x002,.        
22450 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73 6f 72        ("---- sor
22460 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25 64 2f  t cost=%-3d (%d/
22470 25 64 29 20 69 6e 63 72 65 61 73 65 73 20 63 6f  %d) increases co
22480 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64 5c 6e  st %3d to %-3d\n
22490 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
224a0 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72    aSortCost[isOr
224b0 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65 72 42  dered], (nOrderB
224c0 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20 6e 4f  y-isOrdered), nO
224d0 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20  rderBy, .       
224e0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
224f0 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20 20 20  d, rCost));.    
22500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22510 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72 55 6e       rCost = rUn
22520 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20  sorted;.        
22530 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
22540 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
22550 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
22560 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20  dded to the set 
22570 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 78  of.        ** mx
22580 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f 2d 66  Choice best-so-f
22590 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20 20 20  ar paths..      
225a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
225b0 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 61  First look for a
225c0 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74 68 20  n existing path 
225d0 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61  among best-so-fa
225e0 72 20 70 61 74 68 73 0a 20 20 20 20 20 20 20 20  r paths.        
225f0 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73 20 74  ** that covers t
22600 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 6c  he same set of l
22610 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74 68 65  oops and has the
22620 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65 64 0a   same isOrdered.
22630 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69          ** setti
22640 6e 67 20 61 73 20 74 68 65 20 63 75 72 72 65 6e  ng as the curren
22650 74 20 70 61 74 68 20 63 61 6e 64 69 64 61 74 65  t path candidate
22660 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
22670 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65 72 6d       ** The term
22680 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   "((pTo->isOrder
22690 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
226a0 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75 69 76  80)==0" is equiv
226b0 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  alent.        **
226c0 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65   to (pTo->isOrde
226d0 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69 73 4f  red==(-1))==(isO
226e0 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22 20 66  rdered==(-1))" f
226f0 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20 20 20  or the range.   
22700 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67 61 6c       ** of legal
22710 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73 4f 72   values for isOr
22720 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e 0a 20  dered, -1..64.. 
22730 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22740 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d    for(jj=0, pTo=
22750 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b  aTo; jj<nTo; jj+
22760 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
22770 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 6d 61       if( pTo->ma
22780 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a  skLoop==maskNew.
22790 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28             && ((
227a0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69  pTo->isOrdered^i
227b0 73 4f 72 64 65 72 65 64 29 26 30 78 38 30 29 3d  sOrdered)&0x80)=
227c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
227d0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
227e0 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20  case( jj==nTo-1 
227f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
22800 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22810 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22820 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20      if( jj>=nTo 
22830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
22840 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 69 73  None of the exis
22850 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66 61 72  ting best-so-far
22860 20 70 61 74 68 73 20 6d 61 74 63 68 20 74 68 65   paths match the
22870 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 20   candidate. */. 
22880 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
22890 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20 20 20  >=mxChoice.     
228a0 20 20 20 20 20 20 26 26 20 28 72 43 6f 73 74 3e        && (rCost>
228b0 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f 73 74  mxCost || (rCost
228c0 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55 6e 73  ==mxCost && rUns
228d0 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72 74 65  orted>=mxUnsorte
228e0 64 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  d)).          ){
228f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
22900 54 68 65 20 63 75 72 72 65 6e 74 20 63 61 6e 64  The current cand
22910 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65 74 74  idate is no bett
22920 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66 20 74  er than any of t
22930 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 20 20  he mxChoice.    
22940 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74 68 73          ** paths
22950 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
22960 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 62 75  e best-so-far bu
22970 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63 61 72  ffer.  So discar
22980 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
22990 20 74 68 69 73 20 63 61 6e 64 69 64 61 74 65 20   this candidate 
229a0 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e 20 2a  as not viable. *
229b0 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  /.#ifdef WHERETR
229c0 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
229d0 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
229e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
229f0 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22a10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22a20 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d  "Skip   %s cost=
22a30 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
22a40 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
22a50 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
22a60 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
22a70 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
22a80 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20  st, nOut,.      
22a90 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
22aa0 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64  dered>=0 ? isOrd
22ab0 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
22ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
22ad0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
22ae0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
22af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22b00 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
22b10 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69 74 20   this points it 
22b20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
22b30 65 77 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ew candidate pat
22b40 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  h.          ** n
22b50 65 65 64 73 20 74 6f 20 62 65 20 61 64 64 65 64  eeds to be added
22b60 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62   to the set of b
22b70 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
22b80 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
22b90 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20  f( nTo<mxChoice 
22ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
22bb0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73  * Increase the s
22bc0 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73  ize of the aTo s
22bd0 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20  et by one */.   
22be0 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54           jj = nT
22bf0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  o++;.          }
22c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22c10 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65    /* New path re
22c20 70 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72  places the prior
22c30 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63   worst to keep c
22c40 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f  ount below mxCho
22c50 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ice */.         
22c60 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20 20 20     jj = mxI;.   
22c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22c80 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
22c90 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
22ca0 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20  RACE_ENABLED /* 
22cb0 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x4 */.         
22cc0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
22cd0 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20  eTrace&0x4 ){.  
22ce0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22cf0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 4e 65  3DebugPrintf("Ne
22d00 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  w    %s cost=%-3
22d10 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
22d20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22d30 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
22d40 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
22d50 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
22d60 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
22d70 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
22d80 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
22d90 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
22da0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22db0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22dc0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c        /* Control
22dd0 20 72 65 61 63 68 65 73 20 68 65 72 65 20 69 66   reaches here if
22de0 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
22df0 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20 63 6f  h pTo=aTo[jj] co
22e00 76 65 72 73 20 74 68 65 0a 20 20 20 20 20 20 20  vers the.       
22e10 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74 20 6f     ** same set o
22e20 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20  f loops and has 
22e30 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65 72 65  the sam isOrdere
22e40 64 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65  d setting as the
22e50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
22e60 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20 20 43  ndidate path.  C
22e70 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
22e80 68 65 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f  he candidate sho
22e90 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20 20 20  uld replace.    
22ea0 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f 72 20        ** pTo or 
22eb0 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
22ec0 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
22ed0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
22ee0 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72  if( pTo->rCost<r
22ef0 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e 72 43  Cost || (pTo->rC
22f00 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20 70 54  ost==rCost && pT
22f10 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29 20 29  o->nRow<=nOut) )
22f20 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  {.#ifdef WHERETR
22f30 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
22f40 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x4 */.          
22f50 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
22f60 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22f80 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22fa0 20 20 20 22 53 6b 69 70 20 20 20 25 73 20 63 6f     "Skip   %s co
22fb0 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65  st=%-3d,%3d orde
22fc0 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20  r=%c",.         
22fd0 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
22fe0 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c  thName(pFrom, iL
22ff0 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43  oop, pWLoop), rC
23000 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20  ost, nOut,.     
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
23020 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
23030 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
23040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23050 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23060 74 66 28 22 20 20 20 76 73 20 25 73 20 63 6f 73  tf("   vs %s cos
23070 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65 72 3d  t=%-3d,%d order=
23080 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
23090 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
230a0 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
230b0 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
230c0 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64    pTo->isOrdered
230f0 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64  >=0 ? pTo->isOrd
23100 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b  ered+'0' : '?');
23110 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
23120 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
23130 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
23140 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
23150 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
23160 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  sideration */.  
23170 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
23180 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  se( pTo->rCost==
23190 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20  rCost );.       
231a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
231b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
231c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
231d0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
231e0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
231f0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
23200 65 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63  es here if the c
23210 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73  andidate path is
23220 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
23230 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
23240 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65  o path.  Replace
23250 20 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61   pTo with the ca
23260 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64  ndidate. */.#ifd
23270 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
23280 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
23290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
232a0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
232b0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
232c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
232d0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
232e0 20 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25         "Update %
232f0 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
23300 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20  order=%c",.     
23310 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
23320 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
23330 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
23340 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
23360 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
23370 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
23380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
23390 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
233a0 28 22 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d  ("  was %s cost=
233b0 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  %-3d,%3d order=%
233c0 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
233d0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
233e0 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31  ame(pTo, iLoop+1
233f0 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74  , 0), pTo->rCost
23400 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20  , pTo->nRow,.   
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
23420 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
23430 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
23440 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
23450 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
23460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23470 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20   /* pWLoop is a 
23480 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20  winner.  Add it 
23490 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 62 65  to the set of be
234a0 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  st so far */.   
234b0 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f       pTo->maskLo
234c0 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  op = pFrom->mask
234d0 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
234e0 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
234f0 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20   pTo->revLoop = 
23500 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20  revMask;.       
23510 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75   pTo->nRow = nOu
23520 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  t;.        pTo->
23530 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
23540 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73         pTo->rUns
23550 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65  orted = rUnsorte
23560 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  d;.        pTo->
23570 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72  isOrdered = isOr
23580 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d  dered;.        m
23590 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70  emcpy(pTo->aLoop
235a0 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20  , pFrom->aLoop, 
235b0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
235c0 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  *)*iLoop);.     
235d0 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c     pTo->aLoop[iL
235e0 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20  oop] = pWLoop;. 
235f0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d         if( nTo>=
23600 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
23610 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20        mxI = 0;. 
23620 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20           mxCost 
23630 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a  = aTo[0].rCost;.
23640 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f            mxUnso
23650 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52  rted = aTo[0].nR
23660 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ow;.          fo
23670 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f  r(jj=1, pTo=&aTo
23680 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65  [1]; jj<mxChoice
23690 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a  ; jj++, pTo++){.
236a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
236b0 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73  pTo->rCost>mxCos
236c0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
236d0 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d  || (pTo->rCost==
236e0 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72  mxCost && pTo->r
236f0 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72  Unsorted>mxUnsor
23700 74 65 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  ted) .          
23710 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
23720 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d     mxCost = pTo-
23730 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  >rCost;.        
23740 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
23750 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65   = pTo->rUnsorte
23760 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
23770 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
23780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
237a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
237b0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
237c0 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
237d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
237e0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
237f0 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x02 ){.      sql
23800 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23810 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e  "---- after roun
23820 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c  d %d ----\n", iL
23830 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  oop);.      for(
23840 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69  ii=0, pTo=aTo; i
23850 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f  i<nTo; ii++, pTo
23860 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
23870 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23880 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e  " %s cost=%-3d n
23890 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25  row=%-3d order=%
238a0 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77  c",.           w
238b0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f  herePathName(pTo
238c0 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70  , iLoop+1, 0), p
238d0 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e  To->rCost, pTo->
238e0 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  nRow,.          
238f0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
23900 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64  =0 ? (pTo->isOrd
23910 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29  ered+'0') : '?')
23920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
23930 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29  o->isOrdered>0 )
23940 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23950 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23960 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20   rev=0x%llx\n", 
23970 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20  pTo->revLoop);. 
23980 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
239a0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
239b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
239c0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
239d0 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68  ..    /* Swap th
239e0 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d  e roles of aFrom
239f0 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65   and aTo for the
23a00 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e   next generation
23a10 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20   */.    pFrom = 
23a20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61  aTo;.    aTo = a
23a30 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20  From;.    aFrom 
23a40 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72  = pFrom;.    nFr
23a50 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20  om = nTo;.  }.. 
23a60 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b   if( nFrom==0 ){
23a70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
23a80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
23a90 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22   query solution"
23aa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
23ab0 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29  Free(db, pSpace)
23ac0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
23ad0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
23ae0 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
23af0 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
23b00 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
23b10 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
23b20 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
23b30 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
23b40 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
23b50 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
23b60 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
23b70 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
23b80 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
23b90 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
23ba0 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
23bb0 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
23bc0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
23bd0 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
23be0 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
23bf0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
23c00 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
23c10 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
23c20 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
23c30 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
23c40 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
23c50 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
23c60 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
23c70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
23c80 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
23c90 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
23ca0 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
23cb0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
23cc0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
23cd0 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
23ce0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
23cf0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
23d00 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
23d10 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
23d20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
23d30 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
23d40 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
23d50 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
23d60 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
23d70 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
23d80 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
23d90 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
23da0 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
23db0 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
23dc0 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 44 69 73 74  o, pWInfo->pDist
23dd0 69 6e 63 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a  inctSet, pFrom,.
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
23e00 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f  Y, nLoop-1, pFro
23e10 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31  m->aLoop[nLoop-1
23e20 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  ], &notUsed);.  
23e30 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f    if( rc==pWInfo
23e40 2d 3e 70 44 69 73 74 69 6e 63 74 53 65 74 2d 3e  ->pDistinctSet->
23e50 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
23e60 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
23e70 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
23e80 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
23e90 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
23ea0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
23eb0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
23ec0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
23ed0 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a  E_DISTINCTBY ){.
23ee0 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
23ef0 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e  >isOrdered==pWIn
23f00 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
23f10 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
23f20 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
23f30 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
23f40 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20  T_ORDERED;.     
23f50 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
23f60 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
23f70 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  at = pFrom->isOr
23f80 64 65 72 65 64 3b 0a 20 20 20 20 20 20 70 57 49  dered;.      pWI
23f90 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70  nfo->revMask = p
23fa0 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
23fb0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
23fc0 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20  >nOBSat<=0 ){.  
23fd0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
23fe0 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  BSat = 0;.      
23ff0 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b    if( nLoop>0 ){
24000 0a 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61  .          Bitma
24010 73 6b 20 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  sk m;.          
24020 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50 61  int rc = wherePa
24030 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
24040 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  By(pWInfo, pWInf
24050 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72  o->pOrderBy, pFr
24060 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  om,.            
24070 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
24080 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e  ORDERBY_LIMIT, n
24090 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
240a0 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
240b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  m);.          if
240c0 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ( rc==pWInfo->pO
240d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
240e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49  .            pWI
240f0 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  nfo->bOrderedInn
24100 65 72 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20  erLoop = 1;.    
24110 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
24120 72 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20  revMask = m;.   
24130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24140 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24150 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
24160 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
24170 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
24180 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 57 49  ).        && pWI
24190 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49  nfo->nOBSat==pWI
241a0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
241b0 45 78 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a  Expr && nLoop>0.
241c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74      ){.      Bit
241d0 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
241e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
241f0 65 72 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  er = wherePathSa
24200 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
24210 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
24220 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20  OrderBy, .      
24230 20 20 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c      pFrom, 0, nL
24240 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c  oop-1, pFrom->aL
24250 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72  oop[nLoop-1], &r
24260 65 76 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a  evMask.      );.
24270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
24280 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20  Info->sorted==0 
24290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72  );.      if( nOr
242a0 64 65 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72  der==pWInfo->pOr
242b0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
242c0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
242d0 73 6f 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  sorted = 1;.    
242e0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d      pWInfo->revM
242f0 61 73 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20  ask = revMask;. 
24300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24310 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  ...  pWInfo->nRo
24320 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
24330 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
24340 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
24350 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
24360 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
24370 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
24380 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
24390 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
243a0 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
243b0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
243c0 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
243d0 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
243e0 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
243f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
24400 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
24410 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
24420 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
24430 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
24440 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
24450 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
24460 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
24470 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
24480 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
24490 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
244a0 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
244b0 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
244c0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
244d0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
244e0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
244f0 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
24500 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
24510 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
24520 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
24530 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
24540 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
24550 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
24560 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
24570 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
24580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
24590 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
245a0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
245b0 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
245c0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
245d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
245e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
245f0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
24600 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
24610 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
24620 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
24630 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
24640 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
24650 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70  ndex *pIdx;..  p
24660 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
24670 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20  ->pWInfo;.  if( 
24680 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
24690 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
246a0 42 43 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e  BCLAUSE ) return
246b0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   0;.  assert( pW
246c0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
246d0 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74  nSrc>=1 );.  pIt
246e0 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  em = pWInfo->pTa
246f0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62  bList->a;.  pTab
24700 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
24710 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
24720 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
24730 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66  ;.  if( pItem->f
24740 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
24750 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72  return 0;.  iCur
24760 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
24770 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e  r;.  pWC = &pWIn
24780 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70  fo->sWC;.  pLoop
24790 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
247a0 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  w;.  pLoop->wsFl
247b0 61 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70  ags = 0;.  pLoop
247c0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70  ->nSkip = 0;.  p
247d0 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68  Term = sqlite3Wh
247e0 65 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c  ereFindTerm(pWC,
247f0 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
24800 5f 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20  _EQ|WO_IS, 0);. 
24810 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
24820 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
24830 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
24840 4f 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f  O_IS );.    pLoo
24850 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
24860 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
24870 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45  RE_IPK|WHERE_ONE
24880 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  ROW;.    pLoop->
24890 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
248a0 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  m;.    pLoop->nL
248b0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c  Term = 1;.    pL
248c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
248d0 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e   = 1;.    /* TUN
248e0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72  ING: Cost of a r
248f0 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31  owid lookup is 1
24900 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 */.    pLoop->
24910 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33  rRun = 33;  /* 3
24920 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
24930 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  (10) */.  }else{
24940 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
24950 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
24960 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
24970 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  xt){.      int o
24980 70 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73  pMask;.      ass
24990 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  ert( pLoop->aLTe
249a0 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e  rmSpace==pLoop->
249b0 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  aLTerm );.      
249c0 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64  if( !IsUniqueInd
249d0 65 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20  ex(pIdx).       
249e0 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  || pIdx->pPartId
249f0 78 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20  xWhere!=0 .     
24a00 20 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43    || pIdx->nKeyC
24a10 6f 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f  ol>ArraySize(pLo
24a20 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  op->aLTermSpace)
24a30 20 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e   .      ) contin
24a40 75 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b  ue;.      opMask
24a50 20 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74   = pIdx->uniqNot
24a60 4e 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f  Null ? (WO_EQ|WO
24a70 5f 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20  _IS) : WO_EQ;.  
24a80 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
24a90 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
24aa0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72  +){.        pTer
24ab0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
24ac0 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  FindTerm(pWC, iC
24ad0 75 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b  ur, j, 0, opMask
24ae0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
24af0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20   if( pTerm==0 ) 
24b00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74  break;.        t
24b10 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
24b20 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
24b30 53 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  S );.        pLo
24b40 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
24b50 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
24b60 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
24b70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
24b80 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
24b90 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
24ba0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
24bb0 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
24bc0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
24bd0 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
24be0 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
24bf0 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
24c00 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d  sInIndex(pIdx))=
24c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
24c20 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
24c30 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
24c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
24c50 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
24c60 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
24c70 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
24c80 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
24c90 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
24ca0 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
24cb0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
24cc0 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
24cd0 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
24ce0 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
24cf0 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
24d00 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
24d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24d20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
24d30 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
24d40 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
24d50 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
24d60 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
24d70 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
24d80 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
24d90 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
24da0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
24db0 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  sMaskSet, iCur);
24dc0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
24dd0 5d 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72  ].iTabCur = iCur
24de0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  ;.    pWInfo->nR
24df0 6f 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69  owOut = 1;.    i
24e00 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
24e10 72 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f  rBy ) pWInfo->nO
24e20 42 53 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e  BSat =  pWInfo->
24e30 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
24e40 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
24e50 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
24e60 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
24e70 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
24e80 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
24e90 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
24ea0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64  IQUE;.    }.#ifd
24eb0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24ec0 20 20 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d      pLoop->cId =
24ed0 20 27 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20   '0';.#endif.   
24ee0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
24ef0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
24f00 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
24f10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
24f20 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
24f30 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
24f40 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
24f50 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
24f60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
24f70 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
24f80 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
24f90 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
24fa0 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
24fb0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
24fc0 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
24fd0 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
24fe0 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
24ff0 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
25000 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
25010 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
25020 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
25030 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
25040 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
25050 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
25060 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
25070 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
25080 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
25090 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
250a0 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
250b0 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
250c0 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
250d0 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
250e0 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
250f0 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
25100 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
25110 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
25120 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
25130 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
25140 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
25150 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
25160 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
25170 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
25180 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
25190 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
251a0 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
251b0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
251c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
251d0 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
251e0 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
251f0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
25200 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
25210 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
25220 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
25230 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
25240 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
25250 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
25260 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
25270 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
25280 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
25290 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
252a0 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
252b0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
252c0 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
252d0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
252e0 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
25310 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
25320 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
25350 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
25360 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
25370 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
25380 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
25390 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
253a0 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
253b0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
253c0 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
253d0 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
253e0 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
253f0 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
25400 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
25410 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
25420 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
25430 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
25440 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
25450 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
25460 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
25470 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
25480 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
25490 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
254a0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
254b0 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
254c0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
254d0 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
254e0 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
254f0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
25500 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
25510 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
25520 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
25530 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
25540 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
25550 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
25560 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
25570 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
25580 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
25590 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
255a0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
255b0 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
255c0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
255d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
255e0 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
255f0 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
25600 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
25610 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
25620 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
25630 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
25640 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
25650 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
25660 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
25670 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
25680 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
25690 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
256a0 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
256b0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
256c0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
256d0 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
256e0 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
256f0 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
25700 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
25710 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
25720 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
25730 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
25740 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
25750 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
25760 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
25770 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
25780 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
25790 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
257a0 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
257b0 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
257c0 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
257d0 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
257e0 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
257f0 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
25800 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
25810 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
25820 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
25830 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
25840 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
25850 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
25860 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
25870 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
25880 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
25890 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
258a0 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
258b0 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
258c0 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
258d0 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
258e0 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
258f0 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
25900 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
25910 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
25920 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
25930 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
25940 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
25950 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
25960 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
25970 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
25980 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
25990 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
259a0 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
259b0 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
259c0 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
259d0 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
259e0 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
259f0 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
25a00 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
25a10 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
25a20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
25a30 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
25a40 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
25a50 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
25a60 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
25a70 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
25a80 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
25a90 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
25aa0 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
25ab0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
25ac0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
25ad0 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
25ae0 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
25af0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
25b00 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
25b10 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
25b20 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
25b30 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
25b40 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
25b50 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
25b60 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
25b70 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70   pOrderBy is a p
25b80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
25b90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f  DER BY clause (o
25ba0 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
25bb0 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20  lause.** if the 
25bc0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
25bd0 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63 74  ag is set in wct
25be0 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45  rlFlags) of a SE
25bf0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
25c00 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
25c10 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
25c20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
25c30 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
25c40 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
25c50 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
25c60 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
25c70 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64  ement, then pOrd
25c80 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
25c90 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72 20  .** The iIdxCur 
25ca0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
25cb0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
25cc0 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  f an index.  If 
25cd0 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  .** WHERE_OR_SUB
25ce0 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69  CLAUSE is set, i
25cf0 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63 75  IdxCur is the cu
25d00 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  rsor number of a
25d10 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73  n index.** to us
25d20 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20  e for OR clause 
25d30 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
25d40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73 68   WHERE clause sh
25d50 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a  ould use this.**
25d60 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f 72   specific cursor
25d70 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50  .  If WHERE_ONEP
25d80 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20 73  ASS_DESIRED is s
25d90 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72  et, then iIdxCur
25da0 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
25db0 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72   cursor in an ar
25dc0 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66  ray of cursors f
25dd0 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20  or all indices. 
25de0 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a   iIdxCur should.
25df0 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f  ** be used to co
25e00 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f 70  mpute the approp
25e10 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65 70  riate cursor dep
25e20 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
25e30 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64  index is.** used
25e40 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
25e50 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
25e60 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
25e70 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
25e80 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
25e90 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
25ea0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
25eb0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20  /* FROM clause: 
25ec0 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
25ed0 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
25ee0 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
25ef0 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20  here,           
25f00 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
25f10 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
25f20 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
25f30 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
25f40 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
25f50 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
25f60 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
25f70 73 74 69 6e 63 74 53 65 74 2c 20 2f 2a 20 54 72  stinctSet, /* Tr
25f80 79 20 6e 6f 74 20 74 6f 20 6f 75 74 70 75 74 20  y not to output 
25f90 74 77 6f 20 72 6f 77 73 20 74 68 61 74 20 64 75  two rows that du
25fa0 70 6c 69 63 61 74 65 20 74 68 65 73 65 20 2a 2f  plicate these */
25fb0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
25fc0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  s,         /* Th
25fd0 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
25fe0 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
25ff0 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
26000 69 41 75 78 41 72 67 20 20 20 20 20 20 20 20 20  iAuxArg         
26010 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
26020 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20  OR_SUBCLAUSE is 
26030 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
26040 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55     ** If WHERE_U
26070 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74  SE_LIMIT, then t
26080 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20  he limit amount 
26090 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
260a0 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eWInfo;         
260b0 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73     /* Num. bytes
260c0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57   allocated for W
260d0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20  hereInfo struct 
260e0 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  */.  int nTabLis
260f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
26100 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
26110 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73  ments in pTabLis
26120 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
26130 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
26140 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
26150 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
26160 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
26170 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
26180 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
26190 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
261a0 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
261b0 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
261c0 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
261d0 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61    /* Cursors tha
261e0 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f  t are not yet po
261f0 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68  sitioned */.  Wh
26200 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
26210 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  WLB;     /* The 
26220 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65  WhereLoop builde
26230 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  r */.  WhereMask
26240 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
26250 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
26260 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
26270 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
26280 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  evel;        /* 
26290 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
262a0 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f  n pWInfo->a[] */
262b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
262c0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  oop;          /*
262d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
262e0 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ngle WhereLoop o
262f0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
26300 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
26310 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
26320 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
26330 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
26340 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
26350 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
26360 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26380 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
26390 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d   u8 bFordelete =
263a0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f   0;         /* O
263b0 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20  PFLAG_FORDELETE 
263c0 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72  or zero, as appr
263d0 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73  opriate */..  as
263e0 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
263f0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
26400 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c  S_MULTIROW)==0 |
26410 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77 63 74  | (.        (wct
26420 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26430 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
26440 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77 63  !=0 .     && (wc
26450 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
26460 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
26470 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f  0 .  ));..  /* O
26480 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45  nly one of WHERE
26490 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72  _OR_SUBCLAUSE or
264a0 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
264b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
264c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
264d0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
264e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
264f0 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  | (wctrlFlags & 
26500 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
26510 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72  ==0 );..  /* Var
26520 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
26530 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
26540 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
26550 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
26560 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20  zeof(sWLB));..  
26570 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55  /* An ORDER/GROU
26580 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d  P BY clause of m
26590 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d  ore than 63 term
265a0 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  s cannot be opti
265b0 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63  mized */.  testc
265c0 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26  ase( pOrderBy &&
265d0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
265e0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
265f0 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
26600 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d  derBy->nExpr>=BM
26610 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30  S ) pOrderBy = 0
26620 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
26630 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
26640 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
26650 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
26660 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
26670 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
26680 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
26690 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
266a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
266b0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
266c0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
266d0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
266e0 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
266f0 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
26700 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
26710 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
26720 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
26730 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
26740 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
26750 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
26760 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
26770 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
26780 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
26790 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
267a0 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
267b0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
267c0 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
267d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
267e0 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
267f0 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
26800 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
26810 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
26820 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
26830 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
26840 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
26850 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
26860 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
26870 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
26880 65 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  e WHERE_OR_SUBCL
26890 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74  AUSE flag is set
268a0 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
268b0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
268c0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
268d0 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
268e0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
268f0 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
26900 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
26910 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
26920 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
26930 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
26940 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
26950 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
26960 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
26970 45 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  E) ? 1 : pTabLis
26980 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
26990 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
269a0 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
269b0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
269c0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
269d0 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
269e0 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
269f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
26a00 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
26a10 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
26a20 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
26a30 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
26a40 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
26a50 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
26a60 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
26a70 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
26a80 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
26a90 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
26aa0 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
26ab0 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
26ac0 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
26ad0 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
26ae0 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
26af0 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
26b00 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
26b10 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
26b20 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
26b30 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
26b40 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
26b50 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
26b60 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
26b70 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
26b80 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
26b90 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20  (db, nByteWInfo 
26ba0 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  + sizeof(WhereLo
26bb0 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  op));.  if( db->
26bc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
26bd0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
26be0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
26bf0 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
26c00 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
26c10 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
26c20 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
26c30 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d  ass[0] = pWInfo-
26c40 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
26c50 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d   = -1;.  pWInfo-
26c60 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
26c70 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
26c80 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
26c90 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
26ca0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
26cb0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
26cc0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
26cd0 57 49 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74  WInfo->pDistinct
26ce0 53 65 74 20 3d 20 70 44 69 73 74 69 6e 63 74 53  Set = pDistinctS
26cf0 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  et;.  pWInfo->iB
26d00 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  reak = pWInfo->i
26d10 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
26d20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
26d30 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  v);.  pWInfo->wc
26d40 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
26d50 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
26d60 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72  >iLimit = iAuxAr
26d70 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76  g;.  pWInfo->sav
26d80 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
26d90 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
26da0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  p;.  assert( pWI
26db0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
26dc0 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f  NEPASS_OFF );  /
26dd0 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c  * ONEPASS defaul
26de0 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70  ts to OFF */.  p
26df0 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
26e00 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73  o->sMaskSet;.  s
26e10 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
26e20 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
26e30 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
26e40 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57    sWLB.pNew = (W
26e50 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61  hereLoop*)(((cha
26e60 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65  r*)pWInfo)+nByte
26e70 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  WInfo);.  assert
26e80 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
26e90 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77  GNMENT(sWLB.pNew
26ea0 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  ) );.  whereLoop
26eb0 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b  Init(sWLB.pNew);
26ec0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26ed0 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77  EBUG.  sWLB.pNew
26ee0 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e  ->cId = '*';.#en
26ef0 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20  dif..  /* Split 
26f00 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
26f10 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
26f20 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
26f30 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
26f40 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
26f50 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
26f60 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
26f70 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
26f80 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
26f90 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49  ite3WhereClauseI
26fa0 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  nit(&pWInfo->sWC
26fb0 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c  , pWInfo);.  sql
26fc0 69 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 26  ite3WhereSplit(&
26fd0 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68  pWInfo->sWC, pWh
26fe0 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  ere, TK_AND);.  
26ff0 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
27000 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
27010 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
27020 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
27030 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
27040 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
27050 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
27060 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
27070 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66  l thru..  */.  f
27080 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42  or(ii=0; ii<sWLB
27090 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  .pWC->nTerm; ii+
270a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62  +){.    if( nTab
270b0 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
270c0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
270d0 4e 6f 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43  NotJoin(sWLB.pWC
270e0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
270f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
27100 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
27110 65 2c 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69  e, sWLB.pWC->a[i
27120 69 5d 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f  i].pExpr, pWInfo
27130 2d 3e 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20  ->iBreak,.      
27140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27150 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
27160 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c  NULL);.      sWL
27170 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46  B.pWC->a[ii].wtF
27180 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
27190 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
271a0 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
271b0 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  : No FROM clause
271c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62  .  */.  if( nTab
271d0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
271e0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 57  f( pOrderBy ) pW
271f0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
27200 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
27210 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
27220 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
27230 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
27240 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
27250 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
27260 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
27270 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
27280 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
27290 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
272a0 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
272b0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
272c0 2a 0a 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20  *.  ** The N-th 
272d0 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
272e0 20 63 6c 61 75 73 65 20 69 73 20 61 73 73 69 67   clause is assig
272f0 6e 65 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66  ned a bitmask of
27300 20 31 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   1<<N..  **.  **
27310 20 54 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65   The rule of the
27320 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
27330 63 65 20 65 6e 73 75 72 65 73 20 74 68 74 61 20  ce ensures thta 
27340 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
27350 61 73 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74  ask for.  ** a t
27360 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31  able T, then X-1
27370 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
27380 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  for all other ta
27390 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
273a0 20 6f 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77   of T..  ** Know
273b0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ing the bitmask 
273c0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
273d0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
273e0 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a  left join is.  *
273f0 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  * important.  Ti
27400 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
27410 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
27420 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65  bitmasks are cre
27430 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61  ated for all pTa
27440 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c  bList->nSrc tabl
27450 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c  es in.  ** pTabL
27460 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ist, not just th
27470 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74  e first nTabList
27480 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69   tables.  nTabLi
27490 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20  st is normally. 
274a0 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61   ** equal to pTa
274b0 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20  bList->nSrc but 
274c0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e  might be shorten
274d0 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20  ed to 1 if the. 
274e0 20 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42   ** WHERE_OR_SUB
274f0 43 4c 41 55 53 45 20 66 6c 61 67 20 69 73 20 73  CLAUSE flag is s
27500 65 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  et..  */.  for(i
27510 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74  i=0; ii<pTabList
27520 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20  ->nSrc; ii++){. 
27530 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d     createMask(pM
27540 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
27550 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
27560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  ;.    sqlite3Whe
27570 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50  reTabFuncArgs(pP
27580 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d  arse, &pTabList-
27590 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d  >a[ii], &pWInfo-
275a0 3e 73 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65  >sWC);.  }.#ifde
275b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
275c0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
275d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
275e0 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ++){.    Bitmask
275f0 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72   m = sqlite3Wher
27600 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  eGetMask(pMaskSe
27610 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
27620 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
27630 20 61 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b   assert( m==MASK
27640 42 49 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23  BIT(ii) );.  }.#
27650 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
27660 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
27670 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a  ubexpressions. *
27680 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  /.  sqlite3Where
27690 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  ExprAnalyze(pTab
276a0 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  List, &pWInfo->s
276b0 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  WC);.  if( db->m
276c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
276d0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
276e0 6f 72 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c  or;..  if( wctrl
276f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
27700 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20  NT_DISTINCT ){. 
27710 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63     if( isDistinc
27720 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73  tRedundant(pPars
27730 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
27740 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 44 69 73 74  Info->sWC, pDist
27750 69 6e 63 74 53 65 74 29 20 29 7b 0a 20 20 20 20  inctSet) ){.    
27760 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43    /* The DISTINC
27770 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69  T marking is poi
27780 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20  ntless.  Ignore 
27790 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  it. */.      pWI
277a0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
277b0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
277c0 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
277d0 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
277e0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
277f0 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68  y to ORDER BY th
27800 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
27810 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72  make distinct pr
27820 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20  ocessing easier 
27830 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
27840 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  >wctrlFlags |= W
27850 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b  HERE_DISTINCTBY;
27860 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
27870 4f 72 64 65 72 42 79 20 3d 20 70 44 69 73 74 69  OrderBy = pDisti
27880 6e 63 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20  nctSet;.    }.  
27890 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  }..  /* Construc
278a0 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  t the WhereLoop 
278b0 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64  objects */.#if d
278c0 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
278d0 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28  E_ENABLED).  if(
278e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
278f0 63 65 20 26 20 30 78 66 66 66 66 20 29 7b 0a 20  ce & 0xffff ){. 
27900 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27910 72 69 6e 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d  rintf("*** Optim
27920 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28  izer Start *** (
27930 77 63 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78  wctrlFlags: 0x%x
27940 22 2c 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  ",wctrlFlags);. 
27950 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
27960 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  s & WHERE_USE_LI
27970 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIT ){.      sql
27980 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
27990 22 2c 20 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69  ", limit: %d", i
279a0 41 75 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20  AuxArg);.    }. 
279b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
279c0 72 69 6e 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20  rintf(")\n");.  
279d0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  }.  if( sqlite3W
279e0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
279f0 30 20 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20  0 ){ /* Display 
27a00 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
27a10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
27a20 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
27a30 65 43 6c 61 75 73 65 50 72 69 6e 74 28 73 57 4c  eClausePrint(sWL
27a40 42 2e 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  B.pWC);.  }.#end
27a50 69 66 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69  if..  if( nTabLi
27a60 73 74 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68  st!=1 || whereSh
27a70 6f 72 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30  ortCut(&sWLB)==0
27a80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65   ){.    rc = whe
27a90 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57  reLoopAddAll(&sW
27aa0 4c 42 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  LB);.    if( rc 
27ab0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
27ac0 6e 45 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65  nError;.  .#ifde
27ad0 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
27ae0 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
27af0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
27b00 7b 20 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20  {    /* Display 
27b10 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65  all of the Where
27b20 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Loop objects */.
27b30 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20        WhereLoop 
27b40 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  *p;.      int i;
27b50 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
27b60 6e 73 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b  nst char zLabel[
27b70 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  ] = "0123456789a
27b80 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
27b90 72 73 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20  rstuvwyxz".     
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bc0 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46 47          "ABCDEFG
27bd0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
27be0 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28  YXZ";.      for(
27bf0 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
27c00 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70  , i=0; p; p=p->p
27c10 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a  NextLoop, i++){.
27c20 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d          p->cId =
27c30 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66   zLabel[i%sizeof
27c40 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20  (zLabel)];.     
27c50 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
27c60 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a  t(p, sWLB.pWC);.
27c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
27c80 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72  ndif.  .    wher
27c90 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
27ca0 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fo, 0);.    if( 
27cb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27cc0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
27cd0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  inError;.    if(
27ce0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
27cf0 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72  y ){.       wher
27d00 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e  ePathSolver(pWIn
27d10 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  fo, pWInfo->nRow
27d20 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69  Out+1);.       i
27d30 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
27d40 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
27d50 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
27d60 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e  }.  }.  if( pWIn
27d70 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  fo->pOrderBy==0 
27d80 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
27d90 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
27da0 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  der)!=0 ){.     
27db0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20  pWInfo->revMask 
27dc0 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20  = ALLBITS;.  }. 
27dd0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
27de0 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d  r || NEVER(db->m
27df0 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a  allocFailed) ){.
27e00 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
27e10 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69  ginError;.  }.#i
27e20 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
27e30 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
27e40 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
27e50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
27e60 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
27e70 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64  Solution nRow=%d
27e80 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  ", pWInfo->nRowO
27e90 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ut);.    if( pWI
27ea0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b  nfo->nOBSat>0 ){
27eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
27ec0 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45  bugPrintf(" ORDE
27ed0 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20  RBY=%d,0x%llx", 
27ee0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20  pWInfo->nOBSat, 
27ef0 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29  pWInfo->revMask)
27f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
27f10 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  ch( pWInfo->eDis
27f20 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63  tinct ){.      c
27f30 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
27f40 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
27f50 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27f60 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49  gPrintf("  DISTI
27f70 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20  NCT=unique");.  
27f80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27f90 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
27fa0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
27fb0 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
27fc0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27fd0 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
27fe0 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  =ordered");.    
27ff0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28000 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
28010 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
28020 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
28030 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
28040 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54  intf("  DISTINCT
28050 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20  =unordered");.  
28060 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
28080 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
28090 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  f("\n");.    for
280a0 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f  (ii=0; ii<pWInfo
280b0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b  ->nLevel; ii++){
280c0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
280d0 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b  Print(pWInfo->a[
280e0 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42  ii].pWLoop, sWLB
280f0 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pWC);.    }.  }
28100 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74  .#endif.  /* Att
28110 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62  empt to omit tab
28120 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69  les from the joi
28130 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66  n that do not ef
28140 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 20  fect the result 
28150 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  */.  if( pWInfo-
28160 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26  >nLevel>=2.   &&
28170 20 70 44 69 73 74 69 6e 63 74 53 65 74 21 3d 30   pDistinctSet!=0
28180 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
28190 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
281a0 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
281b0 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  in).  ){.    Bit
281c0 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73  mask tabUsed = s
281d0 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c  qlite3WhereExprL
281e0 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65  istUsage(pMaskSe
281f0 74 2c 20 70 44 69 73 74 69 6e 63 74 53 65 74 29  t, pDistinctSet)
28200 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70  ;.    if( sWLB.p
28210 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
28220 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69   tabUsed |= sqli
28230 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73 74  te3WhereExprList
28240 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
28250 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a  sWLB.pOrderBy);.
28260 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
28270 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
28280 3d 32 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =2 ){.      Wher
28290 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70  eTerm *pTerm, *p
282a0 45 6e 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  End;.      pLoop
282b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49   = pWInfo->a[pWI
282c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70  nfo->nLevel-1].p
282d0 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28  WLoop;.      if(
282e0 20 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   (pWInfo->pTabLi
282f0 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
28300 62 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  b].fg.jointype &
28310 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62   JT_LEFT)==0 ) b
28320 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
28330 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28340 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
28350 54 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  T)==0.       && 
28360 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
28370 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
28380 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
28390 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
283a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 74 61   }.      if( (ta
283b0 62 55 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d  bUsed & pLoop->m
283c0 61 73 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72  askSelf)!=0 ) br
283d0 65 61 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  eak;.      pEnd 
283e0 3d 20 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20  = sWLB.pWC->a + 
283f0 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b  sWLB.pWC->nTerm;
28400 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
28410 3d 73 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54  =sWLB.pWC->a; pT
28420 65 72 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b  erm<pEnd; pTerm+
28430 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
28440 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
28450 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  l & pLoop->maskS
28460 65 6c 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20  elf)!=0.        
28470 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
28480 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
28490 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
284a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
284b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
284c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
284d0 20 20 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45      if( pTerm<pE
284e0 6e 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nd ) break;.    
284f0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
28500 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c  fff, ("-> drop l
28510 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c  oop %c not used\
28520 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29  n", pLoop->cId))
28530 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
28540 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
28550 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
28560 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
28570 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
28580 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
28590 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
285a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
285b0 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
285c0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
285d0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
285e0 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
285f0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
28600 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
28610 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
28620 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
28630 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
28640 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
28650 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20  ropriate..  */. 
28660 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
28670 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
28680 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
28690 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
286a0 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
286b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
286c0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
286d0 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ED)!=0 ){.    in
286e0 74 20 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e  t wsFlags = pWIn
286f0 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d  fo->a[0].pWLoop-
28700 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e  >wsFlags;.    in
28710 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46  t bOnerow = (wsF
28720 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
28730 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  ROW)!=0;.    if(
28740 20 62 4f 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c   bOnerow.     ||
28750 20 28 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20   ((wctrlFlags & 
28760 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
28770 4c 54 49 52 4f 57 29 21 3d 30 0a 20 20 20 20 20  LTIROW)!=0.     
28780 20 20 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46        && 0==(wsF
28790 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
287a0 54 55 41 4c 54 41 42 4c 45 29 29 0a 20 20 20 20  TUALTABLE)).    
287b0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
287c0 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65  >eOnePass = bOne
287d0 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49  row ? ONEPASS_SI
287e0 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d  NGLE : ONEPASS_M
287f0 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20  ULTI;.      if( 
28800 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73  HasRowid(pTabLis
28810 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26  t->a[0].pTab) &&
28820 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
28830 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
28840 20 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c         if( wctrl
28850 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
28860 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29  EPASS_MULTIROW )
28870 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46 6f 72  {.          bFor
28880 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f  delete = OPFLAG_
28890 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  FORDELETE;.     
288a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49     }.        pWI
288b0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
288c0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46  ->wsFlags = (wsF
288d0 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44  lags & ~WHERE_ID
288e0 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d  X_ONLY);.      }
288f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28900 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
28910 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
28920 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
28930 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
28940 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
28950 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
28960 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
28970 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
28980 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
28990 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
289a0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
289b0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
289c0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
289d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
289e0 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
289f0 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
28a00 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
28a10 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
28a20 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
28a30 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
28a40 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
28a50 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
28a60 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
28a70 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
28a80 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
28a90 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
28aa0 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
28ab0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
28ac0 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
28ad0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
28ae0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
28af0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
28b00 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
28b10 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
28b20 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
28b30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
28b40 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
28b50 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
28b60 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
28b70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
28b80 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
28b90 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
28ba0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
28bb0 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
28bc0 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
28bd0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
28be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28bf0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
28c00 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
28c10 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
28c20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28c30 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
28c40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
28c50 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
28c60 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
28c70 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
28c80 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
28c90 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
28ca0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28cb0 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
28cc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
28cd0 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
28ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
28cf0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
28d00 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
28d10 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
28d20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
28d30 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
28d40 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
28d50 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
28d60 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
28d70 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
28d80 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
28d90 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
28da0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73  b, op);.      as
28db0 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
28dc0 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d  iCursor==pLevel-
28dd0 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  >iTabCur );.    
28de0 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
28df0 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
28e00 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
28e10 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
28e20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28e30 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
28e40 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
28e50 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
28e60 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
28e70 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
28e80 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
28e90 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20   pTab->nCol<BMS 
28ea0 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
28eb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ) ){.        Bit
28ec0 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
28ed0 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
28ee0 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
28ef0 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
28f00 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
28f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28f20 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
28f30 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
28f40 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
28f50 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
28f60 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
28f70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   );.      }.#ifd
28f80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
28f90 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
28fa0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75      if( pLoop->u
28fb0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
28fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28fd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
28fe0 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  v, OPFLAG_SEEKEQ
28ff0 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20  |bFordelete);.  
29000 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
29010 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
29020 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
29030 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65  geP5(v, bFordele
29040 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  te);.      }.#if
29050 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
29060 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
29070 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  SK.      sqlite3
29080 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
29090 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
290a0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
290b0 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  sor, 0, 0,.     
290c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290d0 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38         (const u8
290e0 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  *)&pTabItem->col
290f0 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b  Used, P4_INT64);
29100 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
29110 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
29120 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
29130 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
29140 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
29150 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
29160 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
29170 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
29180 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
29190 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  *pIx = pLoop->u.
291a0 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
291b0 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
291c0 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  r;.      int op 
291d0 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  = OP_OpenRead;. 
291e0 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20       /* iAuxArg 
291f0 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 69 66  is always set if
29200 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76   to a positive v
29210 61 6c 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20  alue if ONEPASS 
29220 69 73 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  is possible */. 
29230 20 20 20 20 20 61 73 73 65 72 74 28 20 69 41 75       assert( iAu
29240 78 41 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e  xArg!=0 || (pWIn
29250 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
29260 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
29270 45 53 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20  ESIRED)==0 );.  
29280 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
29290 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72 69  d(pTab) && IsPri
292a0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78  maryKeyIndex(pIx
292b0 29 0a 20 20 20 20 20 20 20 26 26 20 28 77 63 74  ).       && (wct
292c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
292d0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30  OR_SUBCLAUSE)!=0
292e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
292f0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65    /* This is one
29300 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f   term of an OR-o
29310 70 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e  ptimization usin
29320 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
29330 59 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a  Y of a.        *
29340 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  * WITHOUT ROWID 
29350 74 61 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20  table.  No need 
29360 66 6f 72 20 61 20 73 65 70 61 72 61 74 65 20 69  for a separate i
29370 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
29380 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
29390 65 6c 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20  el->iTabCur;.   
293a0 20 20 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20       op = 0;.   
293b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49     }else if( pWI
293c0 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f  nfo->eOnePass!=O
293d0 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
293e0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20        Index *pJ 
293f0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
29400 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
29410 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41    iIndexCur = iA
29420 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61  uxArg;.        a
29430 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
29440 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
29450 53 5f 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20  S_DESIRED );.   
29460 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
29470 59 53 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49  YS(pJ) && pJ!=pI
29480 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
29490 49 6e 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20  IndexCur++;.    
294a0 20 20 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70        pJ = pJ->p
294b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
294c0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
294d0 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
294e0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72     pWInfo->aiCur
294f0 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e  OnePass[1] = iIn
29500 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65  dexCur;.      }e
29510 6c 73 65 20 69 66 28 20 69 41 75 78 41 72 67 20  lse if( iAuxArg 
29520 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
29530 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
29540 55 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  USE)!=0 ){.     
29550 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69     iIndexCur = i
29560 41 75 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20  AuxArg;.        
29570 6f 70 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64  op = OP_ReopenId
29580 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
29590 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
295a0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
295b0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
295c0 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
295d0 72 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  r = iIndexCur;. 
295e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
295f0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
29600 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
29610 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
29620 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
29630 69 66 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20  if( op ){.      
29640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29650 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65  Op3(v, op, iInde
29660 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
29670 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
29680 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
29690 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
296a0 49 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ix);.        if(
296b0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
296c0 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
296d0 49 4e 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20  INT)!=0.        
296e0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
296f0 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
29700 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
29710 53 4b 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20  SKIPSCAN))==0.  
29720 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
29730 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
29740 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
29750 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
29760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29770 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
29780 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20  OPFLAG_SEEKEQ); 
29790 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42  /* Hint to COMDB
297a0 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  2 */.        }. 
297b0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
297c0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
297d0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65  ->zName));.#ifde
297e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
297f0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
29800 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
29810 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64       u64 colUsed
29820 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29830 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20  int ii, jj;.    
29840 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
29850 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ii<pIx->nColumn;
29860 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
29870 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69      jj = pIx->ai
29880 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20  Column[ii];.    
29890 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30          if( jj<0
298a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
298b0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e           if( jj>
298c0 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20  63 ) jj = 63;.  
298d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
298e0 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
298f0 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d   & MASKBIT(jj))=
29900 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
29910 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
29920 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c  ed |= ((u64)1)<<
29930 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33  (ii<63 ? ii : 63
29940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
29950 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29960 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
29970 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
29980 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20  , iIndexCur, 0, 
29990 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
299a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299b0 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64     (u8*)&colUsed
299c0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
299d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
299e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
299f0 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20  OLUMN_USED_MASK 
29a00 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
29a10 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20  .    if( iDb>=0 
29a20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
29a30 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
29a40 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  , iDb);.  }.  pW
29a50 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
29a60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
29a70 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
29a80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29a90 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
29aa0 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
29ab0 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
29ac0 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
29ad0 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
29ae0 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
29af0 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
29b00 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
29b10 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
29b20 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
29b30 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
29b40 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
29b50 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
29b60 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
29b70 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  st; ii++){.    i
29b80 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a  nt addrExplain;.
29b90 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b      int wsFlags;
29ba0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
29bb0 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
29bc0 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76    wsFlags = pLev
29bd0 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
29be0 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ags;.#ifndef SQL
29bf0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
29c00 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
29c10 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
29c20 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
29c30 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
29c40 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
29c50 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
29c60 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
29c70 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20  o->sWC,.        
29c80 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73          &pTabLis
29c90 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
29ca0 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  om], notReady, p
29cb0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66  Level);.      if
29cc0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29cd0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
29ce0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
29cf0 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72  .#endif.    addr
29d00 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
29d10 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
29d20 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50  Scan(.        pP
29d30 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
29d40 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76  pLevel, ii, pLev
29d50 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
29d60 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20  Flags.    );.   
29d70 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
29d80 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  y = sqlite3VdbeC
29d90 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
29da0 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71     notReady = sq
29db0 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e  lite3WhereCodeOn
29dc0 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
29dd0 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29  o, ii, notReady)
29de0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
29df0 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
29e00 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20  ->addrCont;.    
29e10 69 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45  if( (wsFlags&WHE
29e20 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
29e30 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  && (wctrlFlags&W
29e40 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
29e50 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)==0 ){.      s
29e60 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63  qlite3WhereAddSc
29e70 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61 62  anStatus(v, pTab
29e80 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64  List, pLevel, ad
29e90 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  drExplain);.    
29ea0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65  }.  }..  /* Done
29eb0 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c  . */.  VdbeModul
29ec0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  eComment((v, "Be
29ed0 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29  gin WHERE-core")
29ee0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
29ef0 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
29f00 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
29f10 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
29f20 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57  nError:.  if( pW
29f30 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72  Info ){.    pPar
29f40 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
29f50 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
29f60 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  ueryLoop;.    wh
29f70 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
29f80 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pWInfo);.  }.  r
29f90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
29fa0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
29fb0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
29fc0 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
29fd0 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
29fe0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
29ff0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2a000 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
2a010 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
2a020 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
2a030 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
2a040 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2a050 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
2a060 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2a070 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
2a080 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2a090 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  l;.  WhereLoop *
2a0a0 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74  pLoop;.  SrcList
2a0b0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
2a0c0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2a0d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2a0e0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
2a0f0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
2a100 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
2a110 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  .  */.  VdbeModu
2a120 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
2a130 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  nd WHERE-core"))
2a140 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2a150 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2a160 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
2a170 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
2a180 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
2a190 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65   addr;.    pLeve
2a1a0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2a1b0 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  ];.    pLoop = p
2a1c0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
2a1d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2a1e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2a1f0 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
2a200 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2a210 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
2a220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a230 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65  eAddOp3(v, pLeve
2a240 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->op, pLevel->p
2a250 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70  1, pLevel->p2, p
2a260 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20  Level->p3);.    
2a270 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2a280 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
2a290 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65  >p5);.      Vdbe
2a2a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2a2b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2a2c0 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2a2d0 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20  =OP_Next);.     
2a2e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2a2f0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2a300 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56  P_Prev);.      V
2a310 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2a320 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2a330 56 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  VNext);.    }.  
2a340 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2a350 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
2a360 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e  ABLE && pLevel->
2a370 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20  u.in.nIn>0 ){.  
2a380 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
2a390 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
2a3a0 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
2a3b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2a3c0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2a3d0 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f  drNxt);.      fo
2a3e0 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  r(j=pLevel->u.in
2a3f0 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  .nIn, pIn=&pLeve
2a400 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
2a410 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
2a420 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
2a430 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2a440 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
2a450 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  InTop+1);.      
2a460 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a470 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  Op2(v, pIn->eEnd
2a480 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75  LoopOp, pIn->iCu
2a490 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  r, pIn->addrInTo
2a4a0 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
2a4b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2a4c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2a4d0 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  eIf(v, pIn->eEnd
2a4e0 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49  LoopOp==OP_PrevI
2a4f0 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  fOpen);.        
2a500 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2a510 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  , pIn->eEndLoopO
2a520 70 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  p==OP_NextIfOpen
2a530 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2a540 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2a550 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
2a560 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
2a570 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2a580 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2a590 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
2a5a0 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
2a5b0 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a  el->addrSkip ){.
2a5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a5d0 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d  eGoto(v, pLevel-
2a5e0 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
2a5f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2a600 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61  , "next skip-sca
2a610 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d  n on %s", pLoop-
2a620 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
2a630 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2a640 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2a650 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
2a660 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2a670 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2a680 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
2a690 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20  ddrSkip-2);.    
2a6a0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2a6b0 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54  _LIKE_DOESNT_MAT
2a6c0 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28  CH_BLOBS.    if(
2a6d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
2a6e0 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71  eRep ){.      sq
2a6f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a700 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
2a710 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c  ro, (int)(pLevel
2a720 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e  ->iLikeRepCntr>>
2a730 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1),.            
2a740 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76              pLev
2a750 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29  el->addrLikeRep)
2a760 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2a770 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23  rage(v);.    }.#
2a780 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c  endif.    if( pL
2a790 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
2a7a0 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ){.      addr = 
2a7b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a7c0 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
2a7d0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
2a7e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2a7f0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
2a800 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2a810 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2a820 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
2a830 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    || (pLoop->wsF
2a840 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2a850 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
2a860 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2a870 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
2a880 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
2a890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a8a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
2a8b0 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
2a8c0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
2a8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a8e0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2a8f0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2a900 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a910 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2a920 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
2a930 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
2a940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a950 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2a960 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
2a970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a980 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2a990 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
2a9a0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
2a9b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a9c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a9d0 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d  eGoto(v, pLevel-
2a9e0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
2a9f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2aa00 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2aa10 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
2aa20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
2aa30 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
2aa40 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
2aa50 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
2aa60 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
2aa70 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
2aa80 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62  vel->iFrom].pTab
2aa90 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
2aaa0 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
2aab0 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
2aac0 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
2aad0 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
2aae0 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
2aaf0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
2ab00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2ab10 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
2ab20 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ak);..  assert( 
2ab30 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d  pWInfo->nLevel<=
2ab40 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
2ab50 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
2ab60 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
2ab70 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
2ab80 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
2ab90 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74  .    int k, last
2aba0 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  ;.    VdbeOp *pO
2abb0 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  p;.    Index *pI
2abc0 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
2abd0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2abe0 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
2abf0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2ac00 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
2ac10 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
2ac20 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
2ac30 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
2ac40 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
2ac50 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20  evel->pWLoop;.. 
2ac60 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72     /* For a co-r
2ac70 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61  outine, change a
2ac80 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66  ll OP_Column ref
2ac90 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74  erences to the t
2aca0 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
2acb0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e  he co-routine in
2acc0 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65  to OP_Copy of re
2acd0 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69  sult contained i
2ace0 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20  n a register..  
2acf0 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65    ** OP_Rowid be
2ad00 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20  comes OP_Null.. 
2ad10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
2ad20 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f  abItem->fg.viaCo
2ad30 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e  routine && !db->
2ad40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2ad50 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43        translateC
2ad60 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70  olumnToCopy(v, p
2ad70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c  Level->addrBody,
2ad80 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2ad90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2adb0 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c  abItem->regResul
2adc0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e  t, 0);.      con
2add0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2ade0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
2adf0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
2ae00 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
2ae10 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
2ae20 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  gin..    ** Exce
2ae30 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65  pt, do not close
2ae40 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 69   cursors that wi
2ae50 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62 79 20  ll be reused by 
2ae60 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74  the OR optimizat
2ae70 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52  ion.    ** (WHER
2ae80 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 2e  E_OR_SUBCLAUSE).
2ae90 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f    And do not clo
2aea0 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72  se the OP_OpenWr
2aeb0 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20  ite cursors.    
2aec0 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
2aed0 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
2aee0 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ization..    */.
2aef0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
2af00 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
2af10 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
2af20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
2af30 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
2af40 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2af50 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2af60 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  AUSE)==0.    ){.
2af70 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
2af80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
2af90 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2afa0 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2afb0 53 53 5f 4f 46 46 20 26 26 20 28 77 73 20 26 20  SS_OFF && (ws & 
2afc0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2afd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2afe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2aff0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
2b000 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
2b010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b020 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
2b030 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
2b040 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52    && (ws & (WHER
2b050 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f  E_IPK|WHERE_AUTO
2b060 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20  _INDEX))==0 .   
2b070 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69      && pLevel->i
2b080 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e  IdxCur!=pWInfo->
2b090 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a  aiCurOnePass[1].
2b0a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b0b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b0c0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
2b0d0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
2b0e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b0f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2b100 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
2b110 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f  ex, make VDBE co
2b120 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
2b130 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
2b140 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
2b150 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66  dex instead of f
2b160 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68  rom the table wh
2b170 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  ere possible.  I
2b180 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20  n some cases.   
2b190 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a   ** this optimiz
2b1a0 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74  ation prevents t
2b1b0 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76  he table from ev
2b1c0 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77  er being read, w
2b1d0 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20  hich can.    ** 
2b1e0 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63  yield a signific
2b1f0 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ant performance 
2b200 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20  boost..    ** . 
2b210 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
2b220 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
2b230 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
2b240 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
2b250 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
2b260 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
2b270 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
2b280 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
2b290 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
2b2a0 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
2b2b0 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
2b2c0 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
2b2d0 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
2b2e0 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
2b2f0 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
2b300 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
2b310 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
2b320 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
2b330 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
2b340 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
2b350 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
2b360 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48  WHERE_INDEXED|WH
2b370 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
2b380 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
2b390 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2b3a0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  dex;.    }else i
2b3b0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2b3c0 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
2b3d0 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  OR ){.      pIdx
2b3e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f   = pLevel->u.pCo
2b3f0 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  vidx;.    }.    
2b400 69 66 28 20 70 49 64 78 0a 20 20 20 20 20 26 26  if( pIdx.     &&
2b410 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61   (pWInfo->eOnePa
2b420 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2b430 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 64  || !HasRowid(pId
2b440 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20  x->pTable)).    
2b450 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
2b460 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20  ailed.    ){.   
2b470 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
2b480 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2b490 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70  (v);.      k = p
2b4a0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b  Level->addrBody;
2b4b0 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
2b4c0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
2b4d0 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b   k);.      for(;
2b4e0 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f   k<last; k++, pO
2b4f0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
2b500 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
2b510 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
2b520 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
2b530 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
2b540 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  OP_Column ){.   
2b550 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70         int x = p
2b560 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20  Op->p2;.        
2b570 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
2b580 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a  pTable==pTab );.
2b590 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48            if( !H
2b5a0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
2b5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64  .            Ind
2b5c0 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
2b5d0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
2b5e0 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
2b5f0 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43      x = pPk->aiC
2b600 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20  olumn[x];.      
2b610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e        assert( x>
2b620 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2b630 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20  }.          x = 
2b640 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
2b650 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20  ndex(pIdx, x);. 
2b660 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d           if( x>=
2b670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b680 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20   pOp->p2 = x;.  
2b690 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
2b6a0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
2b6b0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Cur;.          }
2b6c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b6d0 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
2b6e0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2b6f0 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20  NLY)==0 || x>=0 
2b700 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2b710 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2b720 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
2b730 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
2b740 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
2b750 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
2b760 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
2b770 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
2b780 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2b790 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
2b7a0 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70  cleanup.  */.  p
2b7b0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2b7c0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
2b7d0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77  dNQueryLoop;.  w
2b7e0 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
2b7f0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75   pWInfo);.  retu
2b800 72 6e 3b 0a 7d 0a                                rn;.}.